假设我有一个像这样的数据框:
v1 v2 v3
a 1 a
a 2 b
a 6 c
b 3 a
b 4 b
b 5 c
其中v1是一个因子,而v3是一个字符。我想对数据框架应用某些功能,例如将v2拆分为v1,然后将其包含在数据框架中:
v1 v2 v3 v4 v5
a 1 a 1 NA
a 2 b 2 NA
a 6 c 6 NA
b 3 a NA 3
b 4 b NA 4
b 5 c NA 5
我能够解决的解决方案非常复杂。是否有一种优雅的方法?
(注意:存在v3的原因是,任何解决方案都需要能够处理数据帧中其他非数字矢量的存在,因此应该忽略这些矢量。)
1)transform / ifelse如果其中包含少量已知值,一种简单的方法v1
是手动生成每个新列:
transform(DF, a = ifelse(v1 == "a", v2, NA),
b = ifelse(v1 == "b", v2, NA))
2)轻按一种更通用的方法是:
cbind(DF, tapply(DF$v2, list(1:nrow(DF), DF$v1), identity))
上面的解决方案不需要任何附加软件包。
3)data.table。此解决方案假定这v1
是一个因素,并且的行DF
是唯一的(就像问题中的情况一样):
# devtools::install_github("Rdatatable/datatable") # 1.9.3
library(data.table)
DT <- data.table(DF)
DT[, split(v2, v1), by = DT]
如果的行DT
可能不是唯一的,那么(基于与Arun的讨论)将可行:
DT[, c(.SD, split(v2, v1)), by = 1:nrow(DT)][, -1, with = FALSE]
更新一些改进。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句