我在将数据从列转换为行或宽格式时遇到问题。 我的数据框如下所示
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)
答案 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