Log*_*ter 2 split r plyr dataframe
假设我有一个这样的数据框:
v1 v2 v3
a 1 a
a 2 b
a 6 c
b 3 a
b 4 b
b 5 c
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
我能够解决的解决方案非常复杂.这样做有一种优雅的方式吗?
(注意:v3的存在是因为任何解决方案都需要能够处理数据帧中应该忽略的其他非数字向量的存在.)
1)transform/ifelse如果有少量已知值的简单方法v1是手动生成每个新列:
transform(DF, a = ifelse(v1 == "a", v2, NA),
b = ifelse(v1 == "b", v2, NA))
Run Code Online (Sandbox Code Playgroud)
2)tapply更通用的方法是:
cbind(DF, tapply(DF$v2, list(1:nrow(DF), DF$v1), identity))
Run Code Online (Sandbox Code Playgroud)
上述解决方案不需要任何插件包.
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]
Run Code Online (Sandbox Code Playgroud)
如果行DT可能不是唯一的那么(根据与Arun的讨论)这将工作:
DT[, c(.SD, split(v2, v1)), by = 1:nrow(DT)][, -1, with = FALSE]
Run Code Online (Sandbox Code Playgroud)
更新一些改进.