带有 dplyr 的用户定义函数 - 变异列是一个参数
Posted
技术标签:
【中文标题】带有 dplyr 的用户定义函数 - 变异列是一个参数【英文标题】:User-defined function with dplyr - mutate column is a argument 【发布时间】:2021-02-24 00:37:19 【问题描述】:我想在 R 中使用 dplyr 创建一个已定义的函数。但我坚持在 mutate 函数中传递参数。我有两个数据集。
数据1:
GROUP | AGEGRP | COUNT |
---|---|---|
1 | 0 | 15 |
2 | 1 | 20 |
数据2:
GROUP | COUNT |
---|---|
3 | 15 |
我的功能是
freqcnt <- function(var)
var <- enquo(var)
data2 <- data2 %>%
mutate(!!var = 99)
data1 <- data1 %>%
rbind(data2) %>%
return()
当我运行以下代码时,
df <- freqcnt(AGEGRP)
弹出错误信息。
Error: unexpected '=' in:
"
mutate(!!var ="
但是,如果我删除 !!,那么 var 将成为变量的名称,而不是 AGEGRP。请给我看一些灯。谢谢,
【问题讨论】:
无法真正测试它,但我相信在等式左侧使用准引号时,您需要使用海象运算符 ':=' 而不是=
.见here。
【参考方案1】:
这是对您的功能的修复。
library(dplyr)
freqcnt <- function(var)
data2 <- data2 %>%
mutate(var := 99)
data1 <- data1 %>%
rbind(data2)
return(data1)
freqcnt("AGEGRP")
# GROUP AGEGRP COUNT
# 1 1 0 15
# 2 2 1 20
# 3 3 99 15
顺便说一句,因为您使用的是dplyr
。我建议你可以使用bind_rows
函数而不是rbind
。它可以将具有不同列名的数据框组合起来,留下那些不匹配的列NA
。下面是我提出的一个功能。您不再需要指定列名。此外,我将其设计为能够将参数fill
作为填充不匹配列的值。
freqcnt2 <- function(fill)
data1 <- data1 %>%
bind_rows(data2) %>%
mutate(across(.fns = function(x) ifelse(is.na(x), fill, x)))
return(data1)
freqcnt2(99)
# GROUP AGEGRP COUNT
# 1 1 0 15
# 2 2 1 20
# 3 3 99 15
数据
data1 <- data.frame(GROUP = 1:2,
AGEGRP = 0:1,
COUNT = c(15,20))
data2 <- data.frame(GROUP = 3, COUNT = 15)
【讨论】:
谢谢,它有效。我能问一下为什么我们需要两个 和 := 吗?我实际上也在函数中做了一些数据操作,比如左连接和分组。如果我使用 enquo 和 !!,我可以成功地将参数作为 %>% 中的列传递。然后我使用你的脚本 mutate(var := 99),它会生成我想要的正确结果!! 感谢 freqcnt2。因为我还进行其他计算和操作,所以我会看看 mutate 部分如何更好地适合我的函数! @Jemc36 看到这个来了解我们为什么使用
:dplyr.tidyverse.org/articles/programming.html【参考方案2】:
这不是你真正需要的吗:
freqcnt <- function(var)
var <- as.character(substitute(var))
data2[,var] <- 99
return( rbind( data1, data2 ) )
人们有时会痴迷于整洁。
【讨论】:
以上是关于带有 dplyr 的用户定义函数 - 变异列是一个参数的主要内容,如果未能解决你的问题,请参考以下文章