2017-10-09 36 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(我已經更新了我的答案)。另外,我們可以做操作。讓我知道你是否可以找出使用它的任何缺陷。 –