gpt4 book ai didi

r - 如何在dplyr中定义一个函数?

转载 作者:行者123 更新时间:2023-12-04 10:07:55 24 4
gpt4 key购买 nike

我在 dplyr 中创建了一个简单的数据透视表R 中的包。这是我的工作示例:

library(dplyr)
mean_mpg <- mean(mtcars$mpg)

# creating a new variable that shows that Miles/(US) gallon is greater than the mean or not

mtcars <-
mtcars %>%
mutate(mpg_cat = ifelse(mpg > mean_mpg, 1,0))

mtcars %>%
group_by(as.factor(cyl)) %>%
summarise(sum=sum(mpg_cat),total=n()) %>%
mutate(percentage=sum*100/total)

现在,我想编写一个函数来重用此代码:
get_pivot <- function(data, predictor,target) {
result <-
data %>%
group_by(as.factor(predictor)) %>%
summarise(sum=sum(target),total=n()) %>%
mutate(percentage=sum*100/total);

print(result)
}

但我收到以下错误:

Error in is.factor(x) : object 'cyl' not found



我也试过
get_pivot(mtcars, "cyl", "mpg_cat" )

但它没有用。

我该怎么办?

最佳答案

如果您有最新的 rlang库更新 v0.4.0(2019 年 6 月),可以使用双大括号 {{ }} (又名“ curl ”)使 dplyr 编程更容易。

# Note: needs installation of rlang 0.4.0 or later
get_pivot <- function(data, predictor,target) {
result <-
data %>%
group_by(as.factor( {{ predictor }} )) %>%
summarise(sum=sum( {{ target }} ),total=n()) %>%
mutate(percentage=sum*100/total);

print(result)
}

# Edit -- thank you Rui Barradas
> get_pivot(mtcars, cyl, mpg_cat)
# A tibble: 3 x 4
`as.factor(cyl)` sum total percentage
<fct> <dbl> <int> <dbl>
1 4 11 11 100
2 6 3 7 42.9
3 8 0 14 0

需要这样做的原因是 dplyr和其他 tidyverse包使用“非标准评估”,就像你遇到一些基本的 R 函数一样,比如 lm(mpg~factor(am),data=mtcars) .这种做法通常使“交互式”代码更短、更简单、更易于阅读,但代价是使编程更加复杂。在这种情况下, {{ }}运算符用于将您指定的列传输到函数的上下文中。

https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/

关于r - 如何在dplyr中定义一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56896526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com