首页 > 解决方案 > R dplyr 错误 mutate 问题 - 尝试按两列分组并用百分比改变新列

问题描述

我正在尝试创建一个 geom_col 来查看平均值。按类别 + 性别的销售率。为此,我尝试首先 group_by 类别和性别,然后通过 Summarize 保存两个变量,然后在 mutate 函数中创建一个新列,我想在我的 ggplot 中使用它(Geom_col 用于 CATEGORY,facet wrap 用于 Gender)

这是我的错误: Error: Problem with summarise()input total_qty。x 参数 i 的无效“类型”(列表) 输入total_qtysum(qty_sold)

编辑:将示例数据添加为 img。[![在此处输入图像描述][1]][1]

任何人都可以帮助解决这个问题,请。

enter code here
data %>% 
group_by(CATEGORY, Gender) %>%
summarise(total_qty = sum(qty_sold)) %>%
summarise(total_qty_avail = sum(`Qty Received`)) %>%
ungroup %>%
mutate(sell_rate=total_qty/total_qty_avail)%>%
ggplot(data=data,aes(x=CATEGORY,y=sell_rate))+
geom_col() +
facet_wrap(~Gender)

输出结构

 structure(list(CATEGORY = c("A", "A", "B"), Gender = c("M", "F", 
    "M"), `Qty Received` = c(100, 150, 50), qty_sold = c(10, 20, 
    5)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"
    ))

标签: rdplyr

解决方案


在第一summarise条语句之后,唯一可用的列是分组列和“total_qty”。如果我们需要创建“total_qty_avail”,请先创建summarise

library(dplyr)
data %>% 
 group_by(CATEGORY, Gender) %>%
 summarise(total_qty = sum(qty_sold, na.rm = TRUE),
          total_qty_avail = sum(`Qty Received`, na.rm = TRUE), .groups = 'drop')

如果 OP 想要创建仅按 'CATEGORY' 分组的 'total_qty_avail'(假设 OP 知道summarise删除最后一个分组列,则改为按 'CATEGORY' 进行分组,然后使用sum'收到的数量”和“性别”添加为新的分组列

data %>%
     group_by(CATEGORY) %>%
     group_by(total_qty_avail = sum(`Qty Received`, na.rm = TRUE),
              Gender, .add = TRUE) %>%
     summarise(total_qty = sum(qty_sold, na.rm = TRUE), .groups = 'drop')

关于具体错误,可能是因为summarised 列是,list例如,如果我们创建一个listiris并按汇总进行分组,它返回相同的错误

iris %>% 
    mutate(Sepal.Length = list(Sepal.Length)) %>% 
    group_by(Species) %>% 
    summarise(total = sum(Sepal.Length))   

错误:summarise()输入有问题total。✖ 参数的“类型”(列表)无效 ℹ 输入totalsum(Sepal.Length). ℹ 错误发生在第 1 组:Species = "setosa"。运行rlang::last_error()以查看错误发生的位置。

一个选项是unlist列表列到vector

data %>% 
 mutate(qty_sold = unlist(qty_sold)) %>%
 group_by(CATEGORY, Gender) %>%
 summarise(total_qty = sum(qty_sold, na.rm = TRUE),
          total_qty_avail = sum(`Qty Received`, na.rm = TRUE), .groups = 'drop')

通话中还有另一个问题ggplot。由于它已经在链 ( %>%) 中,因此data将是.而不是原始的data(另外,不需要 data 参数)

data %>% 
 group_by(CATEGORY, Gender) %>%
 summarise(total_qty = sum(qty_sold, na.rm = TRUE),
          total_qty_avail = sum(`Qty Received`, na.rm = TRUE), 
            .groups = 'drop') %>%  
  mutate(sell_rate=total_qty/total_qty_avail) %>%   
  ggplot(data=., aes(x = CATEGORY, y = sell_rate)) +
    geom_col() +
    facet_wrap(~Gender)

-输出

在此处输入图像描述


推荐阅读