2014-06-10 22 views
6

例子:如何不同的參數傳遞給各組data.table分組?

這裏是被稱爲dt數據表:

> library(data.table) 
> dt <- data.table(colA=rep(letters[1:3],each=3), colB=0:8) 
> dt 
    colA colB 
1: a 0 
2: a 1 
3: a 2 
4: b 3 
5: b 4 
6: b 5 
7: c 6 
8: c 7 
9: c 8 

我想知道:

對於colA等於 「A」,有沒有colB> 2的任何值?

對於colA等於 「b」 的,有沒有在colB> 3的任何值?

對於colA等於 「c」 的,有沒有在colB> 4的任何值?

我創建一個名爲arg保持爲 「A」 組參數向量, 「B」 & 「C」:

ARG < - C(2,3,4)

誰能給我一個簡單的方式通過colA傳遞argdt分組?

這是我想要的結果:

 colA V1 
    1: a FALSE 
    2: b TRUE 
    3: c TRUE 

這是我在這裏的第一個問題,我試圖使它簡單。先謝謝你。

回答

9

對於它操作的每個小組[.data.table()存儲有關分組變量的當前值(一個或多個)信息(s)在名爲.BY的變量中。

如果您第一次設置了分組變量的水平映射到所需的參數值名爲向量,就可以使用.BY索引進去,提取適當的值,就像這樣:

arg <- setNames(c(2, 3, 4), c("a", "b", "c")) 
arg 
# a b c 
# 2 3 4 

dt[, any(colB > arg[unlist(.BY)]), by="colA"] 
# colA V1 
# 1: a FALSE 
# 2: b TRUE 
# 3: c TRUE 
1

也許不是最優雅的方式,但我會給它一個鏡頭...

#List components of each group 
ref <- dt[,list(colB.list=list(I(colB))),by=colA][,ord:=.I] 

#Feed arguements 
ref[,arg:=c(2,3,4)] 

#Use comparison function 
ref[,V1:=mapply(FUN=function(X,Y){sum(colB.list[[X]]>Y)>0},X=ord,Y=arg)] 
+0

有用!指出'mapply'是很好的。讓我們看看是否有更簡單的解決方案。 – user3724375

3
dt[ , thresh := (2:4)[as.numeric(factor(colA))] ] 
dt 

    colA colB thresh 
1: a 0  2 
2: a 1  2 
3: a 2  2 
4: b 3  3 
5: b 4  3 
6: b 5  3 
7: c 6  4 
8: c 7  4 
9: c 8  4 

dt[, any(colB > thresh),by=colA] 

    colA V1 
1: a FALSE 
2: b TRUE 
3: c TRUE