gre*_*Bag 5 r cbind data.table
我有一个data.tables列表,我需要cbind,但是,我只需要最后的X列.
我的数据结构如下:
DT.1 <- data.table(x=c(1,1), y = c("a","a"), v1 = c(1,2), v2 = c(3,4))
DT.2 <- data.table(x=c(1,1), y = c("a","a"), v3 = c(5,6))
DT.3 <- data.table(x=c(1,1), y = c("a","a"), v4 = c(7,8), v5 = c(9,10), v6 = c(11,12))
DT.list <- list(DT.1, DT.2, DT.3)
>DT.list
[[1]]
x y v1 v2
1: 1 a 1 3
2: 1 a 2 4
[[2]]
x y v3
1: 1 a 5
2: 1 a 6
[[3]]
x y v4 v5 v6
1: 1 a 7 9 11
2: 1 a 8 10 12
Run Code Online (Sandbox Code Playgroud)
列x和y对于每个data.tables都是相同的,但列的数量不同.输出不应包含重复的x和y列.它应该如下所示:
x y v1 v2 v3 v4 v5 v6
1: 1 a 1 3 5 7 9 11
2: 1 a 2 4 6 8 10 12
Run Code Online (Sandbox Code Playgroud)
我想避免使用循环.我能够绑定data.tables使用do.call("cbind", DT.list)然后手动删除重复项,但有没有一种方法,首先不创建重复项?此外,效率很重要,因为列表可能很长,数据量很大.表.
谢谢
以下是如何一次性完成此操作,在调用之前使用从第二个和后续的 data.tables 中lapply()删除列x和:ycbind()
do.call(cbind,c(DT.list[1],lapply(DT.list[2:length(DT.list)],`[`,j=-c(1,2))));
## x y v1 v2 v3 v4 v5 v6
## 1: 1 a 1 3 5 7 9 11
## 2: 1 a 2 4 6 8 10 12
Run Code Online (Sandbox Code Playgroud)
x另一种方法是y在执行直接cbind(). for我认为为此使用循环没有什么问题:
for (i in seq_along(DT.list)[-1]) DT.list[[i]][,c('x','y')] <- NULL;
DT.list;
## [[1]]
## x y v1 v2
## 1: 1 a 1 3
## 2: 1 a 2 4
##
## [[2]]
## v3
## 1: 5
## 2: 6
##
## [[3]]
## v4 v5 v6
## 1: 7 9 11
## 2: 8 10 12
##
do.call(cbind,DT.list);
## x y v1 v2 v3 v4 v5 v6
## 1: 1 a 1 3 5 7 9 11
## 2: 1 a 2 4 6 8 10 12
Run Code Online (Sandbox Code Playgroud)