我希望data.table
中有一列包含list
data.table
的列。我有办法做到这一点,即将每个data.table
自己封装在一个list
中,然后再绑定它们,但这让我感到烦恼。我想以下工作,但它没有:
> x <- list(var1=data.table(a=seq(1:5), b=letters[1:5]), var2="foo")
> y <- list(var1=data.table(a=seq(6:10), b=letters[6:10]), var2="bar")
> z <- rbindlist(list(x, y))
Error in rbindlist(list(x, y)) :
Column 2 of item 1 is length 1, inconsistent with first column of that item which is
length 2. rbind/rbindlist doesn't recycle as it already expects each item to be a uniform
list, data.frame or data.table
如果我将data.table
中的每个list
封装起来,那就可以了:
> x <- list(var1=list(data.table(a=seq(1:5), b=letters[1:5])), var2="foo")
> y <- list(var1=list(data.table(a=seq(6:10), b=letters[6:10])), var2="bar")
> (z <- rbindlist(list(x, y)))
var1 var2
1: <data.table> foo
2: <data.table> bar
我不喜欢以这种方式工作,因为当我选择一个data.table
时,它仍然封装在list
中,如下所示:
> z[1, var1]
[[1]]
a b
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
如果我取消注册,我会获得2 list
而不是data.table
:
> unlist(z[1, var1], recursive=FALSE)
$a
[1] 1 2 3 4 5
$b
[1] "a" "b" "c" "d" "e"
保持data.table
的唯一方法是选择list
的第一个元素(无论如何,它总是包含一个data.table
,我知道):
> z[1, var1][[1]]
a b
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
我这样解决了我的问题,但是,你知道,我不喜欢这种语法。我实际上不希望封装每个data.table
。
我是否遗漏了一些让我无需完成任务的东西?
谢谢!