【问题标题】:how to convert dplyr::summaries to dplyr::do如何将 dplyr::summaries 转换为 dplyr::do
【发布时间】:2016-08-24 12:54:01
【问题描述】:

我有以下数据框:

 label  target    sale
   low    5000    4000
   low   11000    9000
   low    5500    4500
   low   12000    9500
middle   20000   18000
middle   22000  190000
  high  100000   90000
  high  120000   95000

我需要先按标签对数据框进行分组,然后计算:mean(target - sale) 仅适用于 target 超过 10000 的行,我尝试了以下代码:

library(dplyr)
avg_increase <- df %>% 
                  group_by(labels) %>%
                  summarise(avg_sale_increase = ifelse(target >= 10000,mean(target - sale), 0))  

我收到以下错误:

错误:需要单个值

由于summarise 只返回单个值,我是否应该使用deployer::do(或任何其他建议)更改我的代码来完成任务。

【问题讨论】:

  • 你有没有想过这样做:df %&gt;% group_by(labels, target&gt;=1000) %&gt;% summarise(avg_sale_increase = mean(target - sale))。这不会直接回答您的问题,但它会为每个标签提供 2 行:超过 10K 的目标的平均销售增长和低于 10K 的目标的平均销售增长。还请考虑使用相对误差而不是绝对误差,这对于比较各种目标的销售增长非常有用。有了相对误差,可能就不需要过滤目标了。

标签: r dataframe dplyr data-analysis tidyr


【解决方案1】:

问题在于 ifelse,如果长度等于输入逻辑,则返回一个向量,因此将根据需要多次计算平均值。

这应该可以工作

avg_increase <- df %>% 
                group_by(labels) %>% 
                filter(target >= 10000) %>% 
                summarise(target = mean(target-sale))

【讨论】:

    【解决方案2】:

    您可以筛选行>10000 对变量进行分组。

    dat %>% filter(target>10000) %>% 
        group_by(label) %>% mutate(differ = mean(target-sale))
    

    【讨论】:

    • Apols,同样的时间,同样的答案。
    • 完全相同的答案,非常感谢,因为@NJBurgo 有点快,我选择它作为最佳答案。
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多