2014-07-16 29 views
6

Sadece ddply ile başlıyorum ve çok yararlı buluyorum. Bir veri çerçevesini özetlemek ve ayrıca özetlenen sütunun belirli bir değere sahip olup olmadığına bağlı olarak son satırdaki bazı satırlardan kurtulmak istiyorum. Bu, SQL'de HAVING ve GROUP BY gibidir.Ddply'da özetlemenin yanı sıra filtreleme yapmak için herhangi bir yol var mı?

input = data.frame(id=  c(1, 1, 2, 2, 3, 3), 
        metric= c(30,50,70,90,40,1050), 
        badness=c(1, 5, 7, 3, 3, 99)) 
intermediateoutput = ddply(input, ~ id, summarize, 
          meanMetric=mean(metric), 
          maxBadness=max(badness)) 
intermediateoutput[intermediateoutput$maxBadness < 50,1:2] 

Bu veriyor: İşte bir örnek ne istiyorum, ama her nasılsa ddply ifadesi içindeki tek bir adımda yapabilirsiniz

id meanMetric 
1 1   40 
2 2   80 

?

+4

: Eğer kod bu şekilde kolaylaştırabilirsiniz

input %>% group_by(id) %>% summarize(meanMetric=mean(metric), maxBadness=max(badness)) %>% filter(maxBadness <50) %>% select(-maxBadness) 

@Arun comment ardından Eğer zaten "plyr" a bağlı değilseniz, yeni ve geliştirilmiş versiyonu olan dplyr'e doğrudan gitmekten faydalanabilirsiniz. – Ben

+2

Sadece ikisinin de aynı anda yüklendiğinden emin olunuz –

cevap

11

dplyr ile denemelisiniz. Daha hızlı ve kod boruları (%>%) kullanan, özellikle okumak ve anlamak çok daha kolay:

input %>% 
    group_by(id) %>% 
    filter(max(badness)<50) %>% 
    summarize(meanMetric=mean(metric)) 
+1

"as.data.table (input)" için dplyr'de eşdeğer bir yol var mı?, Liste (meanMetric = mean (metric) [max (badness) <50]), by = id] '? – Arun

+1

Evet haklısınız @Arun (her zamanki gibi!). Kod basitleştirilebilir çünkü filtreleme için 'maxBadness' değişkenini hesaplamanız gerekmez. Bir düzenleme olarak ekledim, bence bu 'data.table' kodunuzun eşdeğeridir. – juba

İlgili konular