2014-11-14 14 views
23

Tôi có một khung dữ liệu mà trông như thế này:Tại sao nhóm dplyr của tôi_by & tóm tắt không hoạt động đúng? (Tên va chạm với plyr)

#df 
ID DRUG FED AUC0t Tmax Cmax 
1 1  0 100  5  20 
2 1  1 200  6  25 
3 0  1 NA  2  30 
4 0  0 150  6  65 

Ans vân vân. Tôi muốn tóm tắt một số số liệu thống kê về AUC, Tmax và Cmax theo loại thuốc DRUG và FED STATUS FED. Tôi sử dụng dplyr. Ví dụ: đối với AUC:

CI90lo <- function(x) quantile(x, probs=0.05, na.rm=TRUE) 
CI90hi <- function(x) quantile(x, probs=0.95, na.rm=TRUE) 

summary <- df %>% 
      group_by(DRUG,FED) %>% 
      summarize(mean=mean(AUC0t, na.rm=TRUE), 
           low = CI90lo(AUC0t), 
           high= CI90hi(AUC0t), 
           min=min(AUC0t, na.rm=TRUE), 
           max=max(AUC0t,na.rm=TRUE), 
           sd= sd(AUC0t, na.rm=TRUE)) 

Tuy nhiên, đầu ra không được nhóm bởi DRUG và FED. Nó chỉ đưa ra một dòng có chứa số liệu thống kê của tất cả bởi không có mặt trên DRUG và FED.

Bất kỳ ý tưởng nào tại sao? và làm thế nào tôi có thể làm cho nó làm điều đúng?

+0

Vui lòng kiểm tra liên kết này http://stackoverflow.com/questions/21653295/dplyr-issues-with-group-by – akrun

+0

@akrun Cảm ơn rất nhiều. Tôi đã thực sự hạnh phúc bởi các gói dplyr nhưng có vẻ nó không phải là đáng tin cậy! – Amer

+0

BTW, bạn không nên gắn nhãn các chức năng của mình dưới dạng CI95hi và CI95lo tức là sử dụng 95 thay vì 90? – rnso

Trả lời

59

Tôi tin rằng bạn đã nạp plyr sau dplyr, đó là lý do tại sao bạn đang nhận được một bản tóm tắt tổng thể thay vì một bản tóm tắt nhóm.

Đây là những gì xảy ra với plyr được tải sau cùng.

library(dplyr) 
library(plyr) 
df %>% 
     group_by(DRUG,FED) %>% 
     summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE)) 

    mean low high min max sd 
1 150 105 195 100 200 50 

Bây giờ loại bỏ plyr và thử lại và bạn sẽ có được tóm tắt nhóm.

detach(package:plyr) 
df %>% 
     group_by(DRUG,FED) %>% 
     summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE)) 

Source: local data frame [4 x 8] 
Groups: DRUG 

    DRUG FED mean low high min max sd 
1 0 0 150 150 150 150 150 NaN 
2 0 1 NaN NA NA NA NA NaN 
3 1 0 100 100 100 100 100 NaN 
4 1 1 200 200 200 200 200 NaN 
+0

Đáng nói rằng 'ggplot2' cũng có thể có hiệu ứng này - có lẽ' plyr' là phụ thuộc. – geotheory

2

Hoặc bạn có thể xem xét sử dụng data.table

library(data.table) 
setDT(df) # set the data frame as data table 
df[, list(mean = mean(AUC0t, na.rm=TRUE), 
      low = CI90lo(AUC0t), 
      high = CI90hi(AUC0t), 
      min = as.double(min(AUC0t, na.rm=TRUE)), 
      max = as.double(max(AUC0t, na.rm=TRUE)), 
      sd = sd(AUC0t, na.rm=TRUE)), 
    by=list(DRUG, FED)] 

# DRUG FED mean low high min max sd 
# 1: 1 0 100 100 100 100 100 NA 
# 2: 1 1 200 200 200 200 200 NA 
# 3: 0 1 NaN NA NA Inf -Inf NA 
# 4: 0 0 150 150 150 150 150 NA 
# Warning messages: 
# 1: In min(AUC0t, na.rm = TRUE) : 
# no non-missing arguments to min; returning Inf 
# 2: In max(AUC0t, na.rm = TRUE) : 
# no non-missing arguments to max; returning -Inf 
+0

cảm ơn rất nhiều. Điều đó sẽ làm việc quá, tuy nhiên, tôi sử dụng ddply thay vào đó. ddply trông đáng tin cậy hơn dplyr. – Amer

4

Một biến thể của câu trả lời của aosmith có thể giúp ích cho một số người. Trực tiếp R để gọi hàm dplyr trực tiếp. Tốt lừa khi một gói can thiệp với nhau.

df %>% 
     dplyr::group_by(DRUG,FED) %>% 
     dplyr::summarize(mean=mean(AUC0t, na.rm=TRUE), 
       low = CI90lo(AUC0t), 
       high= CI90hi(AUC0t), 
       min=min(AUC0t, na.rm=TRUE), 
       max=max(AUC0t,na.rm=TRUE), 
       sd= sd(AUC0t, na.rm=TRUE)) 
Các vấn đề liên quan