【问题标题】:transform data from rows to column in R在R中将数据从行转换为列
【发布时间】:2015-04-27 14:52:28
【问题描述】:

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

   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) 

【问题讨论】:

  • 我不认为你想要的输出对于第二行是正确的。
  • 感谢大卫指出已更正,
  • 还是错了,应该是2 1 2.466 NA 123 5.44 NA 366 9.0 NA 2558 18.6 91 NA NA NA

标签: r reshape2


【解决方案1】:

有基础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

或者没有NAs

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

【讨论】:

  • Thx,当您使用t() 进行矩阵转置时,.SD 是什么?
  • .SD 代表 Sub Data,它是 data.table 语法的一部分。看看?data.table
  • 出现j doesn't evaluate to the same number of columns for each group 之类的错误,我认为由于数据很少,V1 可能有 4 行而不是 5 行。
  • 是的,如果没有,两个解决方案都有效。每个 V1 的行数相同。
  • 好吧,试试这个,对于不同大小的数据集Res &lt;- setDT(df)[, list(Value = c(t(.SD))), by = V1] ; dcast(Res[, indx := seq_len(.N), by = V1], V1 ~ indx, value.var = "Value")。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多