r - 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_qty
为sum(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"
))
解决方案
在第一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')
关于具体错误,可能是因为summarise
d 列是,list
例如,如果我们创建一个list
列iris
并按汇总进行分组,它返回相同的错误
iris %>%
mutate(Sepal.Length = list(Sepal.Length)) %>%
group_by(Species) %>%
summarise(total = sum(Sepal.Length))
错误:
summarise()
输入有问题total
。✖ 参数的“类型”(列表)无效 ℹ 输入total
为sum(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)
-输出
推荐阅读
- unit-testing - Golang 单元测试
- c# - 在c#中将没有数组json对象反序列化为字典
- c# - 如何将我的 C# 代码转换为数学公式
- java - 如果存在另一个点 (p,q) 使得 x < p 且 y < q,则返回数组中的一个点 (x,y)
- macos - 使用 SAN 从 Mac 上的钥匙串导出 PEM(主题备用名称)
- node.js - <% %> 和 Visual Studio Code 的问题
- android - 如何使用 SearchView 过滤 FirestoreRecyclerAdapter
- python - 如何从 Python 网站中找出按钮 ID?
- c# - 为什么在 Visual Studio 调试器中双重显示为 int?
- laravel - Laravel 7 中带有 Storage::put() 和 fopen() 的意外行为