【发布时间】:2020-04-30 05:29:00
【问题描述】:
我想根据子字符串分组总结以下数据:
df <- tribble(
~sometext, ~somevalue,
"Kardiochirurgia", 120,
"Kardiologia", 240,
"Ortopedia onkologiczna", 120,
"Kardiochirurgia onkologiczna", 300,
"Ortopedia i traumatologia",110,
"Urologia", 80
)
这是我想要分组的子字符串:
categories <- c("kardio","orto", "uro")
以下代码有效,我会反复使用,所以我想把它变成一个函数:
df %>%
group_by(categories=
str_extract(
string = str_to_lower(.$sometext),
pattern = paste0(categories, collapse="|"))) %>%
summarise(somevalue = sum(somevalue))
脚本完全符合我的预期:
# # A tibble: 3 x 2
# categories somevalue
# <chr> <dbl>
# 1 kardio 660
# 2 orto 230
# 3 uro 80
我把它变成一个函数后,它不起作用:
group_by_str <- function(df, strings, patterns) {
df %>%
group_by(categories=
str_extract(
string = str_to_lower(.[,{{strings}}]),
pattern = paste0(patterns, collapse="|")))
return(df)
}
双括号字符串是我的尝试之一,我首先尝试不使用,尝试传递带引号的名称等但无济于事。 尝试在数据集上使用它:
df %>% group_by_str(strings=sometext, patterns= categories) %>% summarise(somevalue = sum(somevalue))
返回错误,显然它不知道'strings'是包含字符串的列的名称。在这种情况下,将列名传递给函数的正确方法应该是什么?
错误消息表明 R 可以看到列的内容并尝试将其视为列名:
Error: Can't find columns `Kardiochirurgia`, `Kardiologia`, `Ortopedia onkologiczna`, `Kardiochirurgia onkologiczna`, `Ortopedia i traumatologia`, … (and 1 more) in `.data`.
Run `rlang::last_error()` to see where the error occurred.
如果我删除大括号,则错误提示 R 在 DF 中看不到 sometext 列名:
Error in check_names_df(j, x) : object 'sometext' not found
【问题讨论】: