r - mutate() 返回“找不到对象”的错误
问题描述
我正在尝试清理并在我的名为Volume
using的数据中添加一个新列mutate()
。
这是我读入 R 的数据:
> df1 <- file.choose()
> data1 <- read_excel(df1)
> head(data1)
# A tibble: 5 x 3
`product id` amount `total sales`
<chr> <dbl> <dbl>
1 X180 20 200
2 X109 30 300
3 X918 20 200
4 X273 15 150
5 X988 12 120
接下来,我对列进行子集化并重命名为product id
和total sales
,Product Code
然后Net Sales
分别应用mutate()
我自己的函数Net Sales
并创建一个新Volume
列。
> data2 <- data1 %>%
+ select(`Product Code` = `product id`, `Net Sales` = `total sales`) %>%
+ replace_na(list(`Net Sales` = 0))%>%
+ arrange(desc(`Net Sales`))%>%
+ mutate(Volume = rank_volume(data1, `Net Sales`))
这是我收到的错误消息:
Error: Problem with `mutate()` column `Volume`.
ℹ `Volume = rank_volume(data1, `Net Sales`)`.
x arrange() failed at implicit mutate() step.
* Problem with `mutate()` column `..1`.
ℹ `..1 = Net Sales`.
x object 'Net Sales' not found
这是rank_volume
我创建的功能
### a function to label the products that are top one third in total sales as "H", products with the lowest third in sales as "L", and the rest as "M"
rank_volume <- function(data, column) {
column <- ensym(column)
colstr <- as_string(column)
data <- arrange(data, desc(!!column))
size <- length(data[[colstr]])
first_third <- data[[colstr]][round(size / 3)]
last_third <- data[[colstr]][round(size - (size / 3))]
case_when(data[[colstr]] > first_third ~ "H",
data[[colstr]] < last_third ~ "L",
TRUE ~ "M")
}
当我使用一个简单的数据框单独运行我的函数时,它可以完美运行。但是,当我使用 mutate() 运行它时,出现了错误。我找不到问题。任何人都可以帮忙吗?
编辑:dput(head(data))
> dput(head(data1))
structure(list(`product id` = c("X180", "X109", "X918", "X273",
"X988"), amount = c(20, 30, 20, 15, 12), `total sales` = c(200,
300, 200, 150, 120)), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
解决方案
data1
没有Net Sales
列,它存在于您所做的转换中。您可以使用.
来引用管道中的当前数据框。
library(dplyr)
data1 %>%
select(`Product Code` = `product id`, `Net Sales` = `total sales`) %>%
replace_na(list(`Net Sales` = 0))%>%
arrange(desc(`Net Sales`)) %>%
mutate(Volume = rank_volume(., `Net Sales`))
# `Product Code` `Net Sales` Volume
# <chr> <dbl> <chr>
#1 X109 300 H
#2 X180 200 M
#3 X918 200 M
#4 X273 150 L
#5 X988 120 L
或者也可以使用cur_data()
-
data1 %>%
select(`Product Code` = `product id`, `Net Sales` = `total sales`) %>%
replace_na(list(`Net Sales` = 0))%>%
arrange(desc(`Net Sales`)) %>%
mutate(Volume = rank_volume(cur_data(), `Net Sales`))
推荐阅读
- python - 如何使用上一次训练神经网络迭代的准确性作为下一次迭代中 Early Stopping 的基线?
- scala - 由 `K` 索引的 Scala `Set[(K, V)]`
- python - 按单词应用'for'循环
- javascript - 网站页面需要一段时间才能加载图像
- java - 为什么通过python调用我的api会给出无效的日期格式,而在java中却没有(使用相同的字符串)
- sql - 如何在 Oracle 上对多个表上的插入进行排序,以便不破坏 FK 约束
- azure-ad-b2c - 如何更改 azure ad b2c 自定义策略中自断言步骤的最大重试次数
- javascript - 将变量值分配给锚标记以创建超链接
- matlab - 在 Matlab 中从一维数组创建多维数组?
- python - 从 VSCode 运行时尝试通过 Selenium 打开 Firefox 失败