首页 > 解决方案 > 带有 dplyr 的用户定义函数 - 变异列是一个参数

问题描述

我想在 R 中使用 dplyr 创建一个已定义的函数。但我坚持在 mutate 函数中传递参数。我有两个数据集。

数据1:

团体 AGEGRP 数数
1 0 15
2 1 20

数据2:

团体 数数
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。请给我看一些灯。谢谢,

标签: ruser-defined-functionsdplyr

解决方案


这是对您的功能的修复。

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)

推荐阅读