带有 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 的用户定义函数 - 变异列是一个参数的主要内容,如果未能解决你的问题,请参考以下文章

在用户定义的函数中使用胶水进行变异

dplyr 创建一个具有其他列的复杂用户定义函数的新列

R中dplyr包中变异函数的奇怪行为

dplyr 使用条件列和特定行进行变异

当我在`dplyr`之后加载`plyr`时,为啥汇总或变异不适用于group_by?

当我在`dplyr`之后加载`plyr`时,为啥汇总或变异不适用于group_by?