data.table作为data.table列

时间:2017-06-29 17:58:10

标签: r data.table

我希望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

我是否遗漏了一些让我无需完成任务的东西?

谢谢!

0 个答案:

没有答案