将变量名传递给 R 中的函数时出错

Error in passing variable names to a function in R

我正在处理 Excel 文件,这些文件包含文本和数字数据,由名称中包含 space 的 ID 变量跟踪。像这样:

library(tidyverse)
FirstName <- c("George", "Steven", "Kathryn", "Jane")
LastName <- c("Lucas", "Spielberg", "Bigelow", "Campion")
v3 <- (1:4)
value <- c(123, 456, 789, 012)

x <- tibble(FirstName, LastName, v3, value)
names(x) <- c("FirstName", "LastName", "my ID", "value")
x

# A tibble: 4 × 4
  FirstName LastName   `my ID` value
  <chr>     <chr>        <int> <dbl>
1 George    Lucas            1   123
2 Steven    Spielberg        2   456
3 Kathryn   Bigelow          3   789
4 Jane      Campion          4    12

我想编写一个函数,其中 unite 文本列和 summarise 数字列,如下所示:

f <- function(theData, theID) {
  theOutput <- theData %>%
    unite("FullName", FirstName, LastName) %>%
    group_by(FullName, theID) %>%
    summarise(value, sum)

  return(theOutput)
}

但是,当我 运行 函数时出现错误:

> f(x, `my ID`)
 Error: Must group by variables found in `.data`.
* Column `theID` is not found.

如果我运行f(x, 'my ID')返回同样的错误。我假设这个问题与ID变量名中的白色space有关。

对于这个问题是否有一个干净的解决方案,我可以按原样使用变量名,或者我是否必须做一些事情,比如从变量名中去掉所有的白色space?

如果我们传递未加引号的列名(single/double 加引号),则使用 curly-curly 运算符 ({{}}) 在 tidyverse 函数内求值 - 即 group_by 步骤。此外,summarise 中存在语法错误,即函数 sum 应位于 value 列 (sum(value))

f <- function(theData, theID) {
  theOutput <- theData %>%
    unite("FullName", FirstName, LastName) %>%
    group_by(FullName, {{theID}}) %>%
    summarise(value = sum(value, na.rm = TRUE), .groups = 'drop')

  return(theOutput)
}

-测试

  f(x, `my ID`)
# A tibble: 4 × 3
  FullName         `my ID` value
  <chr>              <int> <dbl>
1 George_Lucas           1   123
2 Jane_Campion           4    12
3 Kathryn_Bigelow        3   789
4 Steven_Spielberg       2   456

注意:na.rm = TRUE 是在 sum 中添加的(以防有任何缺失值并想将其删除)。此外,添加了 .groups = 'drop' 以删除组属性(默认情况下,它会删除顺序中的最后一个组并在控制台中抛出一条消息)