2013-04-18 18 views
6

Aynı işlevi birden çok sütuna ddply işlevini kullanarak yazmak istiyorum, ancak bunları bir satırda yazmaya çalışıyorum, bunu görmek için daha iyi bir yol var mı?plyr paketi aynı işlevi birden çok sütun üzerinde yazıyor

İşte verilerin basit bir versiyonu:

data<-data.frame(TYPE=as.integer(runif(20,1,3)),A_MEAN_WEIGHT=runif(20,1,100),B_MEAN_WEIGHT=runif(20,1,10)) 

ve ben bunu yaparak kolonlar A_MEAN_WEIGHT ve B_MEAN_WEIGHT toplamını öğrenmek istiyorum: Ben

ddply(data,.(TYPE),summarise,MEAN_A=sum(A_MEAN_WEIGHT),MEAN_B=sum(B_MEAN_WEIGHT)) 

ama benim mevcut verilerdeki 8'den fazla "* _MEAN_WEIGHT" ve ben

gibi onları 8 defa yazma yoruldum
ddply(data,.(TYPE),summarise,MEAN_A=sum(A_MEAN_WEIGHT),MEAN_B=sum(B_MEAN_WEIGHT),MEAN_C=sum(C_MEAN_WEIGHT),MEAN_D=sum(D_MEAN_WEIGHT),MEAN_E=sum(E_MEAN_WEIGHT),MEAN_F=sum(F_MEAN_WEIGHT),MEAN_G=sum(G_MEAN_WEIGHT),MEAN_H=sum(H_MEAN_WEIGHT)) 

mi Bunu yazmanın daha iyi bir yolu var mı? Yardımın için teşekkürler!!

İşte
ddply(data, .(TYPE), colSums) 

bir (daha yavaş) toplayarak yerine herhangi bir işlev koymak için tweaked olabilir yukarıdaki eşdeğer, var:

cevap

6

plyr -centred yaklaşım kullanmaktır colwise

örn

ddply(data, .(TYPE), colwise(sum)) 
    TYPE A_MEAN_WEIGHT B_MEAN_WEIGHT 
1 1  319.8977  60.80317 
2 2  621.6745  37.05863 

yalnızca bir alt kümesi

isterseniz argüman .col olarak sütun adlarını geçebilir

Ayrıca numara üzerinde hareket etmek için numcolwise veya catcolwise'u da kullanabilirsiniz. sadece ric veya kategorik sütunlar. Eğer colwise

ddply(data, .(TYPE), sapply, FUN = 'mean') 

deyimsel data.table yaklaşım en temel kullanım yerine sapply kullanabilirsiniz

not lapply(.SD, fun)

örn

dt <- data.table(data) 
dt[,lapply(.SD, sum) ,by = TYPE] 
    TYPE A_MEAN_WEIGHT B_MEAN_WEIGHT 
1: 2  621.6745  37.05863 
2: 1  319.8977  60.80317 
+0

Teşekkürler @mnel! sadece bir soru daha, bu şekilde yazmam mümkün görünmüyor ddply (data,. (TYPE), colwise (toplam, (A_MEAN_WEIGHT)), colwise (sqrt,. (B_MEAN_WEIGHT))) Birden çok sütun üzerinde iki farklı işlev istiyorsanız, iki kez yazmalı mıyım? – linp

4

bu deneyin

ddply(data, .(TYPE), function(x) {apply(x, 2, sum)}) 

Ve korumak istiyorsanız .(TYPE) kolonu, böyle yetiremediğin yapacağız:

ddply(data, .(TYPE), function(x) {apply(x[,names(x) != "TYPE"], 2, sum)}) 

daha da iyisi,kullanmakyerine plyr:

library(data.table) 
dt = data.table(data) 

# just sums 
dt[, data.table(t(colSums(.SD))), by = TYPE] 

# sum for "A" and "B", and sqrt(sum) for "C" and "D" 
# note: you will have to call setnames() to fix the column names after 
dt[, data.table(t(colSums(.SD[, c("A_MEAN_WEIGHT", "B_MEAN_WEIGHT"), with = F])), 
       t(apply(.SD[, c("C_MEAN_WEIGHT", "D_MEAN_WEIGHT"), with = F], 
         2, function(x) sqrt(sum(x))))), 
    by = TYPE] 
+0

kullanmaktır Mükemmel çalışıyor! Teşekkürler @eddi !! – linp

+0

Emm ... soruyu soruyorum, eğer 16 sütun varsa ve bunlardan 8'i ve diğer 8'in sqrt (toplamı) toplamını yapmak isterim. – linp

+0

Örn. Yukarıdaki komutu iki kez çalıştırın - her bir işlevle bir kez ve istediğiniz sütunlara göre filtreleyin (örneğin, "apply" içinde% x ("column_a", "column_b", ...) numaranız veya verileriniz için uygun olan her şey) ve daha sonra 'cbind' sonucunu – eddi

İlgili konular