2014-06-10 28 views
6

Örnek: colB> 2 herhangi değerler vardır, colA içinData.table gruplandırmasında her gruba farklı argümanlar nasıl iletilir?

"a" eşittir:

> 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 

Bilmek istiyorum: Burada

dt denilen bir veri tablosu nedir?

colA eşittir "b", colB> 3'te herhangi bir değer var mı?

colA eşittir "c", colB> 4'te herhangi bir değer var mı?

I "b" & "c", "a" grup için bağımsız değişken tutmak için arg adı verilen bir vektör oluşturmak:

< arg - c (2,3,4)

arg'u 'un colA tarafından gruplandırılmasına kadar herkes bana basit bir yol verebilir mi?

İşte benim istenen sonuç:

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

Bu benim ilk soru ve bunu basit yapmaya çalıştı. Şimdiden teşekkür ederim.

cevap

9

, gruplama değişkenin şimdiki değeri (ler) hakkında [.data.table() bilgileri saklar (s) .BY isimli bir değişkende. İlk istenilen parametre değerlerine gruplama değişkenin düzeyleri eşleştiren bir adlandırılmış vektör kurarsanız

, bunu gibi uygun değerleri ayıklanması, içine indeksine .BY kullanabilirsiniz:

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
Muhtemelen

değil en zarif yolu, ama ben denemek olacak ... o çalışır her alt grup için

#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

İşe yarıyor! Mapply'ı işaret etmek güzel. Daha basit bir çözüm olup olmadığını görelim. – 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