插入缺失的列(有正确类型和NA)的另一种方法是使用merge()
函数将第一个数据表A
与一个空数据表A2[0]
合并,该数据表具有第二个数据表的结构。这样可以避免在用户函数中引入错误(我知道merge()
比我自己编写的代码更可靠;))。使用上面mnel的表格,可以像下面的代码一样操作。
此外,处理data.tables
时,使用rbindlist()
应该会更快。
定义表格(与上面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:原作者没有说明如果有匹配变量应该怎么办--我们真的想做一个
rbind()
还是考虑一个
merge()
?
PS2:(由于我没有足够的声望来评论)问题的要点似乎是
这个问题的重复。对于使用大型数据集进行
data.table
vs.
plyr
的基准测试也很重要。