2015-10-31 73 views
0

我想了解dplyr。我正在按數據組,分箱和符號分割數據框中的值,並且我正在嘗試爲每個組/ bin /符號組合獲取平均值。我想輸出一個數據框,每個組/ bin /符號組合的這些計數以及每個組的總數。我想我有它,但有時我得到不同的值在基地R與ddplyr的輸出相比。我是否正確地做這件事?它也很扭曲...有沒有更直接的方法?dplyr:按組查找每個垃圾箱的平均值

library(ggplot2) 
df <- data.frame(
id = sample(LETTERS[1:3], 100, replace=TRUE), 
tobin = rnorm(1000), 
value = rnorm(1000) 
) 
df$tobin[sample(nrow(df), 10)]=0 

df$bin = cut_interval(abs(df$tobin), length=1) 
df$sign = ifelse(df$tobin==0, "NULL", ifelse(df$tobin>0, "-", "+")) 


# Find mean of value by group, bin, and sign using dplyr 
library(dplyr) 
res <- df %>% group_by(id, bin, sign) %>% 
     summarise(Num = length(bin), value=mean(value,na.rm=TRUE)) 

     res %>% group_by(id) %>% 
       summarise(total= sum(Num)) 
      res=data.frame(res) 
      total=data.frame(total) 
      res$total = total[match(res$id, total$id),"total"]    

res[res$id=="A" & res$bin=="[0,1]" & res$sign=="NULL",] 

# Check in base R if mean by group, bin, and sign is correct # Sometimes not? 
groupA = df[df$id=="A" & df$bin=="[0,1]" & df$sign=="NULL",] 
mean(groupA$value, na.rm=T) 

我要瘋了,因爲它並不在我的數據工作,這個命令只是重複整個數據集的平均值:

ddply(df, .(id, bin, sign), summarize, mean = mean(value,na.rm=TRUE)) 

在平均等於平均(值,NA .rm格式= TRUE),完全無視組...所有羣體因素,並且值是數字...

但是這工作:

with(df, aggregate(df$value, by = list(id, bin, sign), FUN = function(x) c(mean(x)))) 

請幫助我..

+2

看起來你也使用'magrittr',行'res <- df %<>%...'有兩個分配,因爲'%<>%'分配和管道。可能你只需要一個普通的管道'%>%'。按原樣,當您運行該代碼時,您正在更新'df'以及'res'。 – Gregor

+0

什麼是'cut_interval()'? – tospig

+0

對不起,cut_interval來自ggplot2 ...它仍然不能這樣工作,我得到的所有垃圾桶的相同平均值... – user971102

回答

1

你似乎在fla a。你有正確的代碼,然後你有額外的代碼。

從一個全新的R對話開始和定義你的數據,然後

library(dplyr) 
res <- df %>% group_by(id, bin, sign) %>% 
     summarise(Num = n(), value = mean(value,na.rm=TRUE)) 

上面的代碼是從你的問題,但我取代length(bin)與內置dplyr::n()功能。上面的代碼給出準確按組平均值:

head(res) 
# id bin sign Num  value 
# 1 A [0,1] - 122 -0.08330338 
# 2 A [0,1] + 111 0.11394381 
# 3 A [0,1] NULL 2 0.75232462 
# 4 A (1,2] - 54 -0.09236725 
# 5 A (1,2] + 45 0.20581095 
# 6 A (2,3] - 12 -0.08998771 

向前跳到代碼塊的最後幾行:

groupA = df[df$id=="A" & df$bin=="[0, 1]" & df$sign=="NULL", ] 
# mean(groupA$value, na.rm=T) 
# [1] 0.7523246 

了上述結果的3號線相匹配。所以你做到了,它工作的很好!

你的代碼的其餘部分是困惑:

res %>% group_by(id) %>% 
       summarise(total= sum(Num)) 

我不知道你想與該完成什麼,但你所以它運行,但不保存不把它分配給什麼。

至於你ddply嘗試:

ddply(df, .(id, bin, sign), summarize, mean = mean(value,na.rm=TRUE)) 

你會發現,如果你有dplyr加載,然後加載plyr庫,還有一個消息:

您已經加載後plyr dplyr - 這可能會導致問題。 如果您需要plyr和dplyr的功能,請先載入plyr,然後dplyr: library(plyr);庫(dplyr)

不要忽視此警告!我的猜測是這發生了,你忽略了它,這是你麻煩來源的一部分。可能你根本不需要plyr,但是如果你這樣做,在dplyr之前加載它

+0

Aaaaa我看到...這讓我發瘋了...非常感謝你這個!!! – user971102