2013-08-26 28 views
5

Bu, oldukça basittir, ancak rasgele sütun seçimine dayalı olarak bazı verileri (ortalama ve medyan) özetleyebilmeyi ve bunun farklı bir sütun tarafından gruplandırılmasını ister.R altbilgi ve özetleme için data.table sözdizimi

aşağıya bakın:

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
ww <- sample(c("y","v"),1) 
DT[,list(avg=mean(ww),med=median(ww)),by="x"] 
    x avg med 
1: a NA y 
2: b NA y 
3: c NA y 
Warning messages: 
1: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
2: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
    argument is not numeric or logical: returning NA 
3: In `[.data.table`(DT, , list(avg = mean(ww), med = median(ww)), : 
argument is not numeric or logical: returning NA 

örnek ww için ise eşit "v" oldu o zaman ben ben ayarlamak gerekir sözdizimi sadece olduğunu düşünüyorum, ancak aşağıdaki çıktı üretmesi

x avg med 
1: a 2 2 
2: b 5 5 
3: c 8 8 

beklenebilir nasıl ayarlanacağından emin değilim ... Herhangi bir yardım büyük ölçüde takdir edilecektir ...

+0

İşte bunu yapmanın başka bir yolu: 'DT [, gecikme (liste (ort = ortalama, med = medyan), işlev (f) f (.SD [[ww]])), = = x Aşağıdaki cevapta açıklandığı gibi "]' ya da 'get' ile ... – Frank

cevap

6

get:

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
> ww <- sample(c("y","v"),1) 
> DT[,list(avg=mean(get(ww)),med=median(get(ww))),by="x"] 
    x  avg med 
1: a 3.333333 3 
2: b 3.333333 3 
3: c 3.333333 3 
> ww 
[1] "y" 
+0

Ah! Basit olduğunu biliyordum! –

+0

@ h.l.m, bu durumda data.table' daha açıklayıcı bir hata mesajı verdiyse daha iyi olur. – A5C1D2H2I1M1N2O1R2T1

+0

Yavaş duydum ama '.SD [[ww]]' de çalışır: 'DT [, liste (ort = ortalama (.SD [[ww]]), med = medyan (.SD [[ww] ])), by = "x"] – Frank

İlgili konular