2012-12-26 47 views
21

Tôi có một mẫu dataframe "dữ liệu" như sau:ddply để tổng hợp theo nhóm R

X   Y Month Year income 
2281205 228120 3 2011 1000 
2281212 228121 9 2010 1100 
2281213 228121 12 2010 900 
2281214 228121 3 2011 9000 
2281222 228122 6 2010 1111 
2281223 228122 9 2010 3000 
2281224 228122 12 2010 1889 
2281225 228122 3 2011 778 
2281243 228124 12 2010 1111 
2281244 228124 3 2011 200 
2281282 228128 9 2010 7889 
2281283 228128 12 2010 2900 
2281284 228128 3 2011 3400 
2281302 228130 9 2010 1200 
2281303 228130 12 2010 2000 
2281304 228130 3 2011 1900 
2281352 228135 9 2010 2300 
2281353 228135 12 2010 1333 
2281354 228135 3 2011 2340 

Tôi muốn sử dụng ddply để tính toán thu nhập cho mỗi Y (không X), nếu tôi có bốn các quan sát cho mỗi Y (ví dụ cho 2281223 với các tháng 6,9,12 của năm 2010 và tháng 3 năm 2011). Nếu tôi có ít hơn bốn quan sát (ví dụ cho Y = 228130), tôi muốn bỏ qua nó. Tôi sử dụng các lệnh sau trong R với mục đích trên:

require(plyr) 
    # the data are in the data csv file 
    data<-read.csv("data.csv") 
    # convert Y (integers) into factors 
    y<-as.factor(y) 
    # get the count of each unique Y 
    count<-ddply(data,.(Y), summarize, freq=length(Y)) 
    # get the sum of each unique Y 
    sum<-ddply(data,.(Y),summarize,tot=sum(income)) 
    # show the sum if number of observations for each Y is less than 4 
    colbind<-cbind(count,sum) 
    finalsum<-subset(colbind,freq>3) 

đầu ra của tôi là như sau:

>colbind 
     Y freq  Y tot 
1 228120 1 228120 1000 
2 228121 3 228121 11000 
3 228122 4 228122 6778 
4 228124 2 228124 1311 
5 228128 3 228128 14189 
6 228130 3 228130 5100 
7 228135 3 228135 5973 
>finalsum 
     Y freq Y.1 tot 
3 228122 4 228122 6778 

Đoạn mã trên hoạt động, nhưng đòi hỏi nhiều bước. Vì vậy, tôi muốn biết liệu có một cách đơn giản để thực hiện nhiệm vụ trên (sử dụng gói plyr) hay không.

+1

bạn có thể tạo cả hai biến 'freq' và' tot' trong một lần với 'tóm tắt' và có thể không cần phải chuyển Y thành yếu tố. – baptiste

Trả lời

30

Như được chỉ ra trong nhận xét, bạn có thể thực hiện nhiều thao tác bên trong summarize.

Điều này làm giảm mã của bạn để một dòng ddply() và một dòng Subsetting, đó là đủ dễ dàng với các [ điều hành:

x <- ddply(data, .(Y), summarize, freq=length(Y), tot=sum(income)) 
x[x$freq > 3, ] 

     Y freq tot 
3 228122 4 6778 

Đây cũng là đặc biệt dễ dàng với các gói data.table:

library(data.table) 
data.table(data)[, list(freq=length(income), tot=sum(income)), by=Y][freq > 3] 
     Y freq tot 
1: 228122 4 6778 

Thực tế, thao tác tính toán chiều dài của vectơ có lối tắt riêng trong data.table - u se .N shortcut:

data.table(data)[, list(freq=.N, tot=sum(income)), by=Y][freq > 3] 
     Y freq tot 
1: 228122 4 6778 
+0

Cảm ơn. Tôi đã sử dụng mã của tôi và mẫu của tôi cho mẫu mở rộng của tôi với N (số quan sát) khoảng 35000. Mất khoảng 200 giây để thực thi cả hai mã. Điều này có bình thường trong hàm ddply không? – Metrics

+3

Có. 'plyr' cực kỳ tiện lợi nhưng có thể chậm, đặc biệt là so với' data.table'. – Andrie

16

Tôi nghĩ rằng gói dplyr nhanh hơn plyr::ddply và thanh lịch hơn.

testData <- read.table(file = "clipboard",header = TRUE) 
require(dplyr) 
testData %>% 
    group_by(Y) %>% 
    summarise(total = sum(income),freq = n()) %>% 
    filter(freq > 3) 
Các vấn đề liên quan