在R中将数据从行转换为列

时间:2015-02-25 14:44:36

标签: r reshape2

我在将数据从列转换为行或宽格式时遇到问题。 我的数据框如下所示

   V1   V2  V3    V4
   1    1  2.041  NA
   1  123  5.190  NA
   1  366  9.500  NA
   1 1462 16.800  NA
   1 2558 23.500  88

   2    1  2.466  NA
   2  123  5.440  NA
   2  366  9.000  NA
   2 2558 18.600  91
   ....

我想将其转换为如下

1 1 2.041 123 5.190 366 9.500 1462 16.800 2558 23.500 88
2 1 2.466 123 5.440 366 9.000 NA   NA     2558 18.600 91

1 1 2.041 NA 123 5.190 NA 366 9.500 NA 1462 16.800 NA 2558 23.500 88
2 1 2.466 NA 123 5.440 NA 366 9.000 NA NA   NA     NA 2558 18.600 91 

我已尝试过像dcast这样的几个选项但是效果不好。

dcast(data,V1~.) 
dcast(data,V1~V2+V3+V4) 

1 个答案:

答案 0 :(得分:3)

基础R

t(matrix(c(t(df[-1])), ncol = length(unique(df$V1))))
#      [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
# [1,]    1 2.041   NA  123 5.19   NA  366  9.5   NA  1462  16.8    NA  2558  23.5    88
# [2,]    1 2.466   NA  123 5.44   NA  366  9.0   NA  1462  13.7    NA  2558  18.6    91

或试试这个

library(data.table)
setDT(df)[, as.list(c(t(.SD))), by = V1]
#    V1 V1    V2 V3  V4   V5 V6  V7  V8 V9  V10  V11 V12  V13  V14 V15
# 1:  1  1 2.041 NA 123 5.19 NA 366 9.5 NA 1462 16.8  NA 2558 23.5  88
# 2:  2  1 2.466 NA 123 5.44 NA 366 9.0 NA 1462 13.7  NA 2558 18.6  91

或没有NA s

setDT(df)[, as.list(na.omit(c(t(.SD)))), by = V1]
#    V1 V1    V2  V3   V4  V5  V6   V7   V8   V9  V10 V11
# 1:  1  1 2.041 123 5.19 366 9.5 1462 16.8 2558 23.5  88
# 2:  2  1 2.466 123 5.44 366 9.0 1462 13.7 2558 18.6  91

根据你的编辑,试试这个:

Res <- setDT(df)[, .(Value = c(t(.SD))), by = V1][, indx := seq_len(.N), by = V1]
dcast(Res, V1 ~ indx, value.var = "Value")
#    V1 1     2  3   4    5  6   7   8  9   10   11 12   13   14 15
# 1:  1 1 2.041 NA 123 5.19 NA 366 9.5 NA 1462 16.8 NA 2558 23.5 88
# 2:  2 1 2.466 NA 123 5.44 NA 366 9.0 NA 2558 18.6 91   NA   NA NA