我想了解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))))
请帮帮我..
答案 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
之前加载!