我有一个包含1M行和2列的data.table
虚拟数据:
require(data.table)
ID <- c(1,2,3)
variable <- c("a,b","a,c","c,d")
dt <- data.table(ID,variable)
dt
> dt
ID variable 1 a,b 2 a,c 3 c,d
现在我想通过“ID”将列“变量”折叠成不同的行,就像reshape2中的“melt”函数或data.table中的melt.data.table一样
这就是我想要的:
ID variable 1 a 1 b 2 a 2 c 3 c 3 d
PS: 鉴于所需的结果,我知道如何进行反向步骤。
dt2 <- data.table(ID = c(1,1,2,2,3,3), variable = c("a","b","a","c","c","d"))
dt3 <- dt2[, list(variables = paste(variable, collapse = ",")), by = ID]
任何提示或建议?
答案 0 :(得分:5)
由于strsplit
已经过矢量化,并且这将是一项耗时的操作,因此我不会在每个组中使用它。相反,可以先在整个列的,
上拆分,然后重建data.table
,如下所示:
var = strsplit(dt$variable, ",", fixed=TRUE)
len = vapply(var, length, 0L)
ans = data.table(ID=rep(dt$ID, len), variable=unlist(var))
# ID variable
# 1: 1 a
# 2: 1 b
# 3: 2 a
# 4: 2 c
# 5: 3 c
# 6: 3 d