每个.SD上的data.table j表达式返回data.table

时间:2017-12-22 09:27:13

标签: r data.table

我刚刚开始使用data.table而且有些东西让我困惑..

在使用.SD时,只要j-expression返回一个列表,列表中的每个元素都应该转换为结果data.table中的一列。

但是,我意识到如果列表的一个元素是data.table,这将不起作用。

# this function returns a list of data.tables
foo = function(dt){
  return(list(a = dt[1:2, 1], 
              b = dt[3, 1:2]))
}

# this function returns a list of numbers
bar = function(dt){
  return(list(a = 1, b = 2))
}

当我尝试这些功能时:

ir = as.data.table(iris)

ir[, bar(.SD), by = Species] 
# this works, a and b are split into 2 columns nicely

ir[, foo(.SD), by = Species]
#this doesn't work, giving me an error:
#Error in `[.data.table`(ir, , foo(.SD), by = Species) : All items in j=list(...) should be atomic vectors or lists.

据我所知,foo()返回列表中的两个data.tables应该变成两列,每列都是data.table。

为什么不发生这种情况?如果是故意这样设计的,原因是什么?

编辑:如果我这样做

ir[, .(foo(.SD)), by = Species]

foo()中返回的每个元素将变成一行(6行,1列,每个物种2行)。但我希望他们每个都在一个列中(3行,2列,每个物种1行)。有没有办法在data.table中这样做?

0 个答案:

没有答案