插入缺失列(具有正确的类型和 NA)的另一种方法是使用具有第二个 data.table 结构的空 data.table 插入merge()
第一个 data.table。这节省了在用户函数中引入错误的可能性(我知道它比我自己的代码更可靠;))。从上面使用 mnel 的表格,执行类似于下面的代码的操作。A
A2[0]
merge()
此外,rbindlist()
在处理data.tables
.
定义表(与上面 mnel 的代码相同):
library(data.table)
A <- data.table(a=1:3, b=1:3, c=1:3)
A2 <- data.table(a=6:9, b=6:9, c=6:9)
B <- data.table(b=1:3, c=1:3, d=1:3, m=LETTERS[1:3])
C <- data.table(n=round(rnorm(3), 2), f=c(T, F, T), c=7:9)
在表 A 中插入缺失的变量:(注意使用A2[0]
A <- merge(x=A, y=A2[0], by=intersect(names(A),names(A2)), all=TRUE)
在表 A2 中插入缺失的列:
A2 <- merge(x=A[0], y=A2, by=intersect(names(A),names(A2)), all=TRUE)
现在应该有相同的列,具有相同的类型A
。A2
将列顺序设置为匹配,以防万一(可能不需要,不确定是否rbindlist()
跨列名或列位置绑定):
setcolorder(A2, names(A))
DT.ALL <- rbindlist(l=list(A,A2))
DT.ALL
对其他表重复...也许将其放入函数中而不是手动重复会更好...
DT.ALL <- merge(x=DT.ALL, y=B[0], by=intersect(names(DT.ALL), names(B)), all=TRUE)
B <- merge(x=DT.ALL[0], y=B, by=intersect(names(DT.ALL), names(B)), all=TRUE)
setcolorder(B, names(DT.ALL))
DT.ALL <- rbindlist(l=list(DT.ALL, B))
DT.ALL <- merge(x=DT.ALL, y=C[0], by=intersect(names(DT.ALL), names(C)), all=TRUE)
C <- merge(x=DT.ALL[0], y=C, by=intersect(names(DT.ALL), names(C)), all=TRUE)
setcolorder(C, names(DT.ALL))
DT.ALL <- rbindlist(l=list(DT.ALL, C))
DT.ALL
结果看起来与 mnels 的输出相同(随机数和列顺序除外)。
PS1:原作者没有说如果有匹配的变量怎么办——我们是真的想做 arbind()
还是在想 a merge()
?
PS2:(因为我没有足够的声誉发表评论)问题的要点似乎与此问题重复。data.table
对于plyr
大型数据集的基准测试也很重要。