附加清单项

时间:2016-06-17 11:57:38

标签: r data.table rbind

我有一个长度的列表(让我们说1000)。列表的每个元素是另一个长度为2的列表。新列表的每个元素都是data.table。每个列表的第二个元素可能是一个空的data.table。

我需要rbind()列表第一个位置的所有data.frames。我目前正在做以下事情:

DT1 = data.table()
DT2 = data.table()
for (i in 1:length(myList)){
     DT1 = rbind(DT1, myList[[i]][[1]]
     DT2 = rbind(DT2, myList[[i]][[2]]
}

这样可行,但速度太慢了。有没有办法可以避免for循环?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

数据表具有专用的快速功能:rbindlist Cf:http://www.inside-r.org/packages/cran/data.table/docs/rbindlist

编辑:

以下是代码

的示例
 library(data.table)            
srcList=list(list(DT1=data.table(X=0),DT2=NULL),list(DT1=data.table(X=2),data.table(Y=3)))
# first have a list for all DT1s
DT1.list= lapply(srcList, FUN=function(el){el$DT1})
rbindlist(DT1.list)

   X
1: 0
2: 2

答案 1 :(得分:1)

这样做:

do.call("rbind", lapply(df.list, "[[", 1)) # for first list element

  # x  y
# 1 1 10
# 2 2 20
# 3 3 30
# 4 4 40
# 5 5 50
# 6 6 60

do.call("rbind", lapply(df.list, "[[", 2)) # for second list element

  # x  y
# 1 1 30
# 2 2 40
# 3 3 50
# 4 4 70
# 5 5 80
# 6 6 90

数据

df.list=list(list(structure(list(x = 1:3, y = c(10, 20, 30)), .Names = c("x", 
"y"), row.names = c(NA, -3L), class = "data.frame"), structure(list(
    x = 1:3, y = c(30, 40, 50)), .Names = c("x", "y"), row.names = c(NA, 
-3L), class = "data.frame")), list(structure(list(x = 4:6, y = c(40, 
50, 60)), .Names = c("x", "y"), row.names = c(NA, -3L), class = "data.frame"), 
    structure(list(x = 4:6, y = c(70, 80, 90)), .Names = c("x", 
    "y"), row.names = c(NA, -3L), class = "data.frame")))

# df.list

# [[1]]
# [[1]][[1]]
  # x  y
# 1 1 10
# 2 2 20
# 3 3 30

# [[1]][[2]]
  # x  y
# 1 1 30
# 2 2 40
# 3 3 50


# [[2]]
# [[2]][[1]]
  # x  y
# 1 4 40
# 2 5 50
# 3 6 60

# [[2]][[2]]
  # x  y
# 1 4 70
# 2 5 80
# 3 6 90