簡體   English   中英

在具有data.frames元素的列表上lapply中使用data.table函數(答案= setDT)

[英]Using data.table function in lapply on a list with data.frames elements (Answer = setDT)

第一個問題,請告訴我是否需要更多信息或背景。

這里和其他地方的許多答案都涉及在data.table函數中調用lapply。 我想做相反的事情,在紙上應該很容易lapply(list.of.dfs, fun(x) x)但我無法使其與data.table函數一起使用。

我有一個包含多個data.frame的列表,這些data.frame具有相同的列,但行數不同。 這來自幾個模擬方案的輸出,因此必須分開對待它們,而不要亂裝。

 #sample list of data.frames
  scenarios <- replicate(5, data.frame(a=sample(letters[1:4],10,T),
                              b=sample(1:2,10,T),
                              x=sample(1:10, 10), 
                              y =runif(10)), simplify = FALSE)

我想向每個元素添加一個列,該元素是x和y由a和b的總和。
從示例部分的data.table文檔中,一個data.frame的執行過程如下(搜索:在doc頁面中按組逐個添加新列):

test <- as.data.table(scenarios[[1]]) #must specify data.table class
test[, newcol := sum(x/y), by = .(a , b)][]

我想使用lapply對方案列表中的每個元素執行相同的操作並返回該列表。 我最近的嘗試:

lapply(scenarios, function(i) {as.data.table(i[, z := sum(x/y), by=.(a,b)]); i})

但我一直得到錯誤unused argument (by = .a,b))

傾倒該站點和其他站點的結果后,我無法解決此問題。 我相當確定,這意味着我對調用匿名函數和/或使用data.table函數不了解。 這是您使用[作為函數的情況之一嗎? 或者我的as.data.table不合適。

這個答案是朝正確方向邁出的一步(我認為),它涵蓋了fun(x){...的使用。 x}使用匿名函數並返回x。

謝謝!

您可以在此處使用setDT

scenarios <- lapply(scenarios, function(i) setDT(i)[, z := sum(x/y), by=.(a,b)])

scenarios[[1]]
   a b  x          y         z
 1: c 2  2 0.87002174  2.298793
 2: b 2 10 0.19720775 78.611837
 3: b 2  8 0.47041670 78.611837
 4: b 2  4 0.36705023 78.611837
 5: a 1  5 0.78922686 12.774035
 6: a 1  6 0.93186209 12.774035
 7: b 1  3 0.83118438  3.609307
 8: c 1  1 0.08248658 30.047494
 9: c 1  7 0.89382050 30.047494
10: c 1  9 0.89172831 30.047494

使用as.data.table ,語法將是

scenarios <- lapply(scenarios, function(i) {i <- as.data.table(i); i[, z := sum(x/y),
                                                                     by=.(a,b)]})

但是不建議這樣做,因為它會創建一個額外的副本,而setDT可以避免setDT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM