dplyr:按组查找每个bin的平均值

时间:2015-10-31 19:56:06

标签: r dplyr

我想了解dplyr。我按照组,分箱和符号在数据框中拆分值,并且我试图获得每个组/箱/符号组合的平均值。我想输出一个数据框,每个组/ bin / sign组合包含这些计数,以及每组的总数。我想我有它,但有时我在基数R中得到的值与ddplyr的输出相比。我这样做了吗?它也是非常扭曲的......有更直接的方式吗?

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))

如果mean等于mean(value,na.rm = TRUE),则完全忽略分组...所有组都是因子,值是数字...

然而这有效:

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

请帮帮我..

1 个答案:

答案 0 :(得分:1)

你好像有点畏缩。你有正确的代码,然后你有额外的代码。

从新的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库,则会显示以下消息:

  

你在dplyr之后加载了plyr - 这可能会导致问题。   如果您需要plyr和dplyr的功能,请先加载plyr,然后再加载dplyr:   库(plyr);库(dplyr)

不要忽视此警告!我猜这是发生了,你忽略了它,这是你麻烦来源的一部分。可能你根本不需要plyr,但如果你这样做,请在 dplyr之前加载