将变量名传递给 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'
以删除组属性(默认情况下,它会删除顺序中的最后一个组并在控制台中抛出一条消息)
我正在处理 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'
以删除组属性(默认情况下,它会删除顺序中的最后一个组并在控制台中抛出一条消息)