2013-01-21 36 views
5

Tôi đang gặp sự cố khi hiểu việc sử dụng gói plyr. Tôi cố gắng sử dụng nó để phân chia các dataframes được lưu trữ trong một danh sách, áp dụng một hàm, lưu trữ các kết quả dưới dạng các khung dữ liệu và kết hợp lại các khung dữ liệu như một danh sách. Vì vậy, cho dữ liệu follwing:Gặp sự cố khi sử dụng gói plyr và làm việc với danh sách

#create test dfs 
    df1<-data.frame(a=sample(1:50,10),b=sample(1:50,10),c=sample(1:50,10),d=(c("a","b","c","a","a","b","b","a","c","d"))) 
    df2<-data.frame(a=sample(1:50,9),b=sample(1:50,9),c=sample(1:50,9),d=(c("e","f","g","e","e","f","f","e","g"))) 
    df3<-data.frame(a=sample(1:50,8),b=sample(1:50,8),c=sample(1:50,8),d=(c("h","i","j","h","h","i","i","h"))) 

    #make them a list 
    list.1<-list(df1=df1,df2=df2,df3=df3) 

Tôi muốn tính giá trị trung bình của mỗi nhóm được xác định trong d của mỗi khung dữ liệu. Nếu tôi muốn sử dụng plyr chỉ trên một dataframe (để tính toán giá trị trung bình của một cột cụ thể của các nhóm) một khả năng sử dụng gói plyr sẽ là:

ddply(df1,.(d),summarise, mean=mean(a)) 

nhưng làm thế nào để áp dụng nó trên tất cả các cột trong dataframe và trên tất cả các khung dữ liệu trong danh sách? và làm thế nào tôi có thể xắp xếp lại tất cả các dữ liệu để cuối cùng tôi nhận được một danh sách với sự kết thúc của các kết quả? Xin lỗi cho câu hỏi rất cơ bản này, nhưng tôi mới đến R và tôi đã thực sự cố gắng giải quyết điều này trong một thời gian ... thx.

Trả lời

1

Đây là giải pháp kết hợp llply()ddply(). Trước tiên, llply() sẽ áp dụng chức năng cho từng phần tử trong danh sách và sẽ trả về một danh sách. Sau đó, ddply() được áp dụng cho mỗi khung dữ liệu trong danh sách và cũng chia từng khung dữ liệu theo cột d. Hàm colMeans() được sử dụng để tính giá trị trung bình cho mỗi cột số.

llply(list.1,function(x) ddply(x,.(d),function(x) colMeans(x[,1:3]))) 
$df1 
    d  a  b  c 
1 a 22.25000 26.25 34.25000 
2 b 19.66667 22.00 28.66667 
3 c 37.00000 44.50 18.00000 
4 d 17.00000 3.00 4.00000 

$df2 
    d  a  b c 
1 e 20.50000 32.25000 18.5 
2 f 25.33333 34.33333 21.0 
3 g 20.50000 26.50000 16.5 

$df3 
    d a  b  c 
1 h 17.5 26.50000 37.25000 
2 i 45.0 22.33333 26.33333 
3 j 25.0 33.00000 42.00000 
+0

hoàn hảo và dễ sử dụng. đó là những gì tôi đã suy nghĩ về nhưng tôi không biết làm thế nào để đặt tên đối tượng bên trong ddply. như thế này nó hoạt động ngay bây giờ! cảm ơn bạn. – Joschi

3

Bạn cần phải đặt tất cả các dữ liệu vào một lớn data.frame:

library(reshape) 

big_dataframe = ldply(list.1, function(x) melt(x, id.vars = "d")) 
> head(big_dataframe) 
    .id d variable value 
1 df1 a  a 44              
2 df1 b  a 17              
3 df1 c  a 15              
4 df1 a  a 30              
5 df1 a  a 49              
6 df1 b  a 33 

... và sau đó sử dụng ddply trên đó.

res = ddply(big_dataframe, .(.id, d, variable), summarise, mn = mean(value)) 
> res 
    .id d variable  mn 
1 df1 a  a 40.00000             
2 df1 a  b 25.25000             
3 df1 a  c 31.25000             
4 df1 b  a 22.66667             
5 df1 b  b 16.00000             
6 df1 b  c 26.00000             
7 df1 c  a 9.00000             
8 df1 c  b 16.50000             
9 df1 c  c 15.00000             
10 df1 d  a 28.00000             
11 df1 d  b 24.00000             
12 df1 d  c 39.00000             
13 df2 e  a 18.50000             
14 df2 e  b 15.50000             
15 df2 e  c 16.50000             
16 df2 f  a 26.33333             
17 df2 f  b 42.00000             
18 df2 f  c 37.00000             
19 df2 g  a 26.50000             
20 df2 g  b 22.00000             
21 df2 g  c 31.00000             
22 df3 h  a 29.25000             
23 df3 h  b 34.25000             
24 df3 h  c 32.00000             
25 df3 i  a 30.33333             
26 df3 i  b 40.00000             
27 df3 i  c 24.33333             
28 df3 j  a 21.00000             
29 df3 j  b 5.00000             
30 df3 j  c 46.00000 

mang đến cho giá trị trung bình của mỗi biến (a-c), mỗi cấp độ của yếu tố d, và mỗi tiểu dataframe (df1-df3).

3

bạn luôn có thể chỉ lapply bạn ddply:

lapply(list.1, function(x) ddply(x, .(d), function(x) 
          data.frame(a=mean(x$a),b=mean(x$b),c= mean(x$c)))) 

hoặc sử dụng mã của bạn chính xác:

lapply(list.1, function(x) ddply(x,.(d),summarise, mean=mean(a))) 
+0

Cảm ơn bạn. thats những gì tôi đã suy nghĩ về nhưng tôi không biết làm thế nào để đặt tên đối tượng trong ddply. tất cả bây giờ có ý nghĩa với chức năng bên trong ... Tôi nghĩ rằng mã đầu tiên bỏ lỡ một) ở cuối. nó hoạt động tốt nhưng tôi sẽ phải lập chỉ mục thủ công tất cả các cột. mã xuống chỉ trả về các phương tiện cho a. – Joschi

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