2014-06-10 7 views
6

Esempio:Come passare argomenti diversi a ciascun gruppo nel raggruppamento di data.table?

Ecco una tabella di dati denominata 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 

Voglio sapere:

Per colA uguale "a", c'è qualche valori in colB> 2?

Per colA è uguale a "b", ci sono valori in colB> 3?

Per colA è uguale a "c", ci sono valori in colB> 4?

creo un vettore chiamato arg per contenere gli argomenti per il gruppo "a", "b" & "c":

arg < - c (2,3,4)

Qualcuno potrebbe darmi un modo semplice per passare arg al raggruppamento di dt per colA?

Ecco il mio risultato desiderato:

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

Questa è la mia prima domanda qui e ho cercato di rendere semplice. Grazie in anticipo.

risposta

9

Per ogni sottogruppo che opera su, [.data.table() memorizza informazioni sul valore corrente (s) della variabile di raggruppamento (s) in una variabile denominata .BY.

Se prima imposta un vettore di nome che mappa i livelli della variabile di raggruppamento per i valori dei parametri desiderati, è possibile utilizzare .BY per indicizzare in esso, estraendo i valori appropriati, in questo modo:

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
non

Probabilmente il modo più elegante, ma darò un colpo ...

#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

Funziona! È bene indicare "mapply". Vediamo se c'è una soluzione più semplice. – 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 
Problemi correlati