2017-10-09 62 views
0

在嵌套data.table中使用data.tables的列表列时,很容易在该列上应用函数。例如:在嵌套data.table中通过引用修改list-column

dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear] 

我们可以使用:

dt[ ,list(length = nrow(dt.mtcars[[1]])), by = gear] 

dt[ ,list(length = nrow(dt.mtcars[[1]])), by = gear] 

    gear length 
1: 4  12 
2: 3  15 
3: 5  5 

dt[, list(length = lapply(dt.mtcars, nrow)), by = gear] 

    gear length 
1: 4  12 
2: 3  15 
3: 5  5 

我想这样做相同的处理,并使用操作:=到每个数据通过参考应用的修改。列的表。

例子:

modify_by_ref<- function(d){ 

    d[, max_hp:= max(hp)] 


} 

dt[, modify_by_ref(dt.mtcars[[1]]), by = gear] 

返回错误:

Error in `[.data.table`(d, , `:=`(max_hp, max(hp))) : 
    .SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference. 

错误消息使用尖端做到以任何方式对我来说不是工作,这似乎是针对另一起案件,但也许我错过了一些东西。有没有任何推荐的方法或灵活的解决方法,以通过refence修改列表列?

给定的表是:

+0

我的理解错误信息,它告诉你正在尝试做什么是不可能的(但)。相反,你必须直接在你的j表达式中使用':=' –

+0

直接在j表达式中使用':='的问题是,只有当data.table首先未被引用时才有可能。 –

+3

这通常不可取。将表格合并为一个,并执行'by ='操作,这些操作已针对'max'和其他常用汇总功能进行了优化... – Frank

回答

1

这可以通过以下两个步骤或单步完成

dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear] 

第1步 - 让我们的dt

每行中添加名单之列 hp矢量
dt[, hp_vector := .(list(dt.mtcars[[1]][, hp])), by = list(gear)] 

第2步 - 现在计算最大值hp

dt[, max_hp := max(hp_vector[[1]]), by = list(gear)] 

给定的表是:

dt<- data.table(mtcars)[, list(dt.mtcars = list(.SD)), by = gear] 

单步 - 单步实际上是上面的两个步骤的组合:

dt[, max_hp := .(list(max(dt.mtcars[[1]][, hp])[[1]])), by = list(gear)] 

如果我们希望通过填充嵌套表内的值参考下面的链接,谈谈如何做到这一点,只是我们需要忽略一条警告消息。如果有人能指出我如何解决警告信息或有任何缺陷,我会很高兴。欲了解更多详细信息,请参阅链接:

https://stackoverflow.com/questions/48306010/how-can-i-do-fast-advance-data-manipulation-in-nested-data-table-data-table-wi/48412406#48412406 

从相同的灵感,我将展示如何在这里为给定的数据集做到这一点。

让我们先清理了一切:在不同的方式

rm(list = ls()) 

让我们重新定义了给定的表就是我所定义的表稍有不同

dt<- data.table(mtcars)[, list(dt.mtcars = list(data.table(.SD))), by = list(gear)] 

注意。除了上述定义中的列表外,我还使用了data.table

接下来,参考嵌套表格中填入最大:

dt[, dt.mtcars := .(list(dt.mtcars[[1]][, max_hp := max(hp)])), by = list(gear)] 

而且,谁也无法预料什么好处,我们可以嵌套表中执行操作:

dt[, dt.mtcars := .(list(dt.mtcars[[1]][, weighted_hp_carb := max_hp*carb])), by = list(gear)] 
+0

感谢您的详细教程,但您的解决方案实际上并未解决问题。它在dt中创建一个新列,而所需的输出将是每个嵌套data.table中的新列。 (也就是说,由其他用户评论,目前还不可能)。 –

+0

要查看差异,请考虑功能实际上是注射而不是汇总(例如:new_hp = hp + 1)的情况。 –

+0

其实,这就是为什么我指出要参考链接的更多细节。无论如何,这里是我们如何在嵌套表中添加max_hp(我已经更新了我的答案)。另外,我们可以做操作。让我知道你是否可以找出使用它的任何缺陷。 –