這與將多個列應用到data.table
的多列的問題非常相似.SDcols
answered thoroughly here。對列的另一個子集(.SDcols)應用函數,同時在另一列(組內)應用不同的函數
不同之處在於我想同時在不屬於.SD
子集的另一列上應用不同的函數。我張貼下面一個簡單的例子來說明我的努力來解決這個問題:
dt = data.table(grp = sample(letters[1:3],100, replace = TRUE),
v1 = rnorm(100),
v2 = rnorm(100),
v3 = rnorm(100))
sd.cols = c("v2", "v3")
dt.out = dt[, list(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
產生以下錯誤:
Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,
: object 'v1' not found
現在,這是有道理的,因爲v1
列不在列的子集,包括必須首先對其進行評估。所以,我進一步探討將其包含在我的專欄的子集:
sd.cols = c("v1","v2", "v3")
dt.out = dt[, list(sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
現在,這不會導致錯誤,但它在V1
欄提供了包含9行(3組)的答案,與和重複三次,如下所示爲放置在V2
所有3列(如預期但不想要的)的裝置:
> dt.out
grp V1 V2
1: c -1.070608 -0.0486639841313638
2: c -1.070608 -0.178154270921521
3: c -1.070608 -0.137625003604012
4: b -2.782252 -0.0794929150464099
5: b -2.782252 -0.149529237116445
6: b -2.782252 0.199925178109264
7: a 6.091355 0.141659419355985
8: a 6.091355 -0.0272192037753071
9: a 6.091355 0.00815760216214876
解決方法解決方案使用2步驟
顯然這可以通過按組計算mean
爲列的子集,並通過組爲單柱也加入到sum
如下解決多個步驟的問題:
dt.out1 = dt[, sum(v1), by = grp]
dt.out2 = dt[, lapply(.SD,mean), by = grp, .SDcols = sd.cols]
dt.out = merge(dt.out1, dt.out2, by = "grp")
> dt.out
grp V1 v2 v3
1: a 6.091355 -0.0272192 0.008157602
2: b -2.782252 -0.1495292 0.199925178
3: c -1.070608 -0.1781543 -0.137625004
我敢肯定,這是一個相當簡單的事情我我錯過了,提前感謝任何指導。
第一個表達式不起作用的事實是一個錯誤imo,所以請提交一個錯誤報告 – eddi