2016-05-04 4 views
2

У меня есть этот dataframe:Как превратить общий фреймворк?

freq  1  2  3  4 
1 100  10  20  30  40 
2 100 0.50 1.00  1.5  2 
3 200  50  60  70  80 
4 200 2.5  3  3.5  4 

Я хочу, чтобы превратить это dataframe таким образом:

freq  1  2   
1 100  10 0.50 
2 100  20  1 
3 100  30 1.50 
4 100  40  2 
5 200  50 2.50 
6 200  60  3 
7 200  70 3.50 
8 200  80  4 

Как я могу это сделать?

Мне нужно что-то, что работает для общего блока данных, а не только в этом случае.

+1

Это не такая хорошая идея, чтобы использовать целые числа в качестве имен столбцов. –

ответ

3

Мы можем попробовать

i1 <- c(TRUE, FALSE) 
data.frame(freq = rep(df1$freq, each =(ncol(df1)-1)/2), 
    `1` = c(t(df1[i1,-1])), `2` = c(t(df1[!i1,-1])), check.names=FALSE) 
# freq 1 2 
#1 100 10 0.5 
#2 100 20 1.0 
#3 100 30 1.5 
#4 100 40 2.0 
#5 200 50 2.5 
#6 200 60 3.0 
#7 200 70 3.5 
#8 200 80 4.0 
2

Или

cbind(
    freq = rep(unique(df$freq), each=ncol(df[, -1])), 
    do.call(rbind, lapply(split(df[, -1], df$freq), function(x) t(x))) 
) 
# freq 1 2 
# 1 100 10 0.5 
# 2 100 20 1.0 
# 3 100 30 1.5 
# 4 100 40 2.0 
# 1 200 50 2.5 
# 2 200 60 3.0 
# 3 200 70 3.5 
# 4 200 80 4.0 
Смежные вопросы