我刚刚开始使用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中这样做?