2012-05-03 38 views
11

Đây có thể là một câu hỏi ngớ ngẩn, nhưng tôi đã đọc qua chương của Crawley về các khung dữ liệu và quét internet và vẫn chưa thể thực hiện bất kỳ điều gì.Tổng hợp các hàng dựa trên các kết hợp yếu tố cụ thể

Đây là một tập dữ liệu mẫu tương tự như tôi:

> data<-data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup", 
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25)) 
> data 
    site  plant treatment plant_numb fruits seeds 
1 A buttercup   1   1  1 45 
2 A buttercup   1   1  2 67 
3 A buttercup   2   2  1 32 
4 A  rose   1   1  4 43 
5 B buttercup   1   1  3 13 
6 B  rose   1   2  2 25 

Những gì tôi muốn làm là tạo ra một kịch bản mà "hạt giống" và "trái cây" được tóm tắt bất cứ khi nào độc đáo trang web & cây & điều trị & plant_numb kết hợp hiện hữu. Lý tưởng nhất, điều này sẽ dẫn đến việc giảm lượng hàng, nhưng một bảo quản các cột gốc (tức là tôi cần những ví dụ trên để trông như thế này :)

site  plant treatment plant_numb fruits seeds 
1 A buttercup   1   1  3 112 
2 A buttercup   2   2  1 32 
3 A  rose   1   1  4 43 
4 B buttercup   1   1  3 13 
5 B  rose   1   2  2 25 

Ví dụ này là khá cơ bản (bộ dữ liệu của tôi là ~ 5000 hàng), và mặc dù ở đây bạn chỉ thấy hai hàng được yêu cầu để được tổng hợp, số hàng cần phải được tổng hợp khác nhau, và nằm trong khoảng từ 1 đến ~ 45.

Tôi đã thử rowsum() và tapply() với kết quả khá ảm đạm (các lỗi cho tôi biết rằng các hàm này không có ý nghĩa cho các yếu tố), vì vậy nếu bạn thậm chí có thể chỉ cho tôi đúng hướng, tôi rất nhiều sẽ đánh giá cao nó!

Cảm ơn bạn rất nhiều!

+0

nhìn vào Thẻ 'plyr' và' data.table'. Rất nhiều câu hỏi về cơ bản giải quyết vấn đề này. Chúc may mắn! – Chase

+0

Xem thêm http://4dpiecharts.com/2011/12/16/a-quick-primer-on-split-apply-combine-problems/ –

Trả lời

11

Hy vọng rằng mã sau khá tự giải thích. Nó sử dụng chức năng cơ bản "tổng hợp" và về cơ bản này là nói cho mỗi sự kết hợp độc đáo của trang web, thực vật, điều trị, và plant_num nhìn vào tổng của các loại trái cây và tổng của hạt giống.

# Load your data 
data <- data.frame(site=c("A","A","A","A","B","B"), plant=c("buttercup","buttercup", 
"buttercup","rose","buttercup","rose"), treatment=c(1,1,2,1,1,1), 
plant_numb=c(1,1,2,1,1,2), fruits=c(1,2,1,4,3,2),seeds=c(45,67,32,43,13,25)) 

# Summarize your data 
aggregate(cbind(fruits, seeds) ~ 
     site + plant + treatment + plant_numb, 
     sum, 
     data = data) 
# site  plant treatment plant_numb fruits seeds 
#1 A buttercup   1   1  3 112 
#2 B buttercup   1   1  3 13 
#3 A  rose   1   1  4 43 
#4 B  rose   1   2  2 25 
#5 A buttercup   2   2  1 32 

Thứ tự của các hàng thay đổi (và được sắp xếp theo trang web, nhà máy, ...) nhưng hy vọng không quá quan tâm.

Một cách khác để thực hiện việc này là sử dụng ddply từ gói plyr.

library(plyr) 
ddply(data, .(site, plant, treatment, plant_numb), 
     summarize, 
     fruits = sum(fruits), 
     seeds = sum(seeds)) 
# site  plant treatment plant_numb fruits seeds 
#1 A buttercup   1   1  3 112 
#2 A buttercup   2   2  1 32 
#3 A  rose   1   1  4 43 
#4 B buttercup   1   1  3 13 
#5 B  rose   1   2  2 25 
+0

Tuyệt vời - Tôi chỉ đang chơi với tổng hợp sau khi tôi đặt câu hỏi, nhưng bạn đã thúc đẩy tôi cùng một cách mạnh mẽ. Cảm ơn bạn đã giúp đỡ. Một câu hỏi nữa, mặc dù: khi tôi nhập mã như bạn đã hiển thị, tôi nhận được lỗi "Lỗi trong as.data.frame.default (x): không thể ép buộc" công thức "lớp thành một data.frame" . Bất kỳ ý tưởng về làm cho nó hoạt động? – user1371443

+0

Cả hai, thật không may. Tôi nhận được thông báo lỗi tương tự cho cả ví dụ và tập dữ liệu thực tế của tôi (không có dấu cách):> tổng hợp (cbind (quả, hạt) ~ site + plant + treatment + plant_numb, sum, data = data) Lỗi trong .data.frame.default (x): không thể ép buộc "công thức" lớp thành một data.frame – user1371443

+0

Giải pháp plyr vẫn hoạt động mà tôi đoán. Nhưng có vẻ như bạn không có phiên bản công thức tổng hợp. Bạn đang sử dụng phiên bản R nào? Tôi nghĩ rằng tổng hợp đã cho phép đầu vào công thức kể từ 2.11 – Dason

4

Và để hoàn thành, đây là giải pháp data.table, theo đề xuất của @Chase. Đối với các tập dữ liệu lớn hơn này có lẽ sẽ là phương pháp nhanh nhất:

library(data.table) 
data.dt <- data.table(data) 
setkey(data.dt, site) 
data.dt[, lapply(.SD, sum), by = list(site, plant, treatment, plant_numb)] 

    site  plant treatment plant_numb fruits seeds 
[1,] A buttercup   1   1  3 112 
[2,] A buttercup   2   2  1 32 
[3,] A  rose   1   1  4 43 
[4,] B buttercup   1   1  3 13 
[5,] B  rose   1   2  2 25 

Phần lapply(.SD, sum) tóm tắt tất cả các cột của bạn mà không phải là một phần của tập nhóm (. Tức là cột không trong by chức năng)

Các vấn đề liên quan