r - 在 R 的函数中只能将字符串转换为符号

标签 r symbols quoting rlang quasiquotes

我有一个函数,旨在对从具有许多手动输入字段的各种来源获得的数据进行操作。由于我不知道这些文件中使用的布局或命名约定会发生什么,我希望它“扫描”数据框以查找字符串为“fix”、“name”或“agent”的列,并且将该列突变为名称为“公司”的新列,然后继续对该列的条目进行字符串清理,最后删除原始列。我已经让它与我已经拥有的一些 CSV 一起工作,但现在遇到了这个错误:ONLY STRINGS CAN BE CONVERTED TO SYMBOLS。我已经检查了这个线程 ERROR: Only strings can be converted to symbols但无济于事。

这是目前的功能:

clean_firm_names2 <- function(df){
  df <- df %>%
    mutate(Firm := !!rlang::sym(grep(pattern = '(AGENT)|(NAME)|(FIX)',x = colnames(.), ignore.case = T, value = T)) %>% 
             str_replace_all(pattern = "(\\W)+"," ") %>% 
             ...str manipulations...
             str_squish()) %>%
    dplyr::select(-(!!rlang::sym(grep(pattern = '(AGENT)|(NAME)|(FIX)',x = colnames(.), ignore.case = T, value = T))))
  return(df)
}

我尝试在 grep() 函数周围使用 as.character() ,但这并没有解决问题。我查看了函数要操作的 CSV,所有列名都是字符串。我使用 vroom() 在 CSV 中读取,就像我的其他 CSV 一样,它工作正常,所有列名都出现了。我可以在 df 上执行其他 dplyr 功能,这表明 df 在其他方面表现正常。关于为什么该功能仅在我的某些 CSV 上阻塞但在其他 CSV 上按预期工作,我已经想不通了。有没有人遇到过类似的问题或得到任何可能导致此错误的线索?这是我第一次使用 SO-- 如果这个问题不是很清楚,我很抱歉。我会尝试根据需要进行编辑。

谢谢!

最佳答案

请注意 grep() 返回匹配项的索引(整数),而不是匹配项本身(字符串)。整数索引可以直接传递给dplyr::rename,所以下面的方法可能效果更好?

i <- grep(pattern = '(AGENT)|(NAME)|(FIX)', x = colnames(df), ignore.case = T, value = T)
df <- df %>%
  rename(Firm = i) %>%
  mutate(Firm = ...str manipulations... )

(这里有一个隐含的假设,即您的 grep() 返回一个单个 索引。可能需要额外的代码来处理多个匹配项。)

关于r - 在 R 的函数中只能将字符串转换为符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380473/

相关文章:

c++ - C++ 符号的作用域

javascript - 在 ES6 中,如何覆盖父类(super class)中的私有(private)方法?

r - 如果我们将 "character"和 "numeric"类型的结果都放在 ifelse 中,为什么 mutate 不起作用?

r - 如何将 lubridate as_datetime 函数与 dplyr mutate 和 case_when 函数结合使用?

r - 将 ggplot map 与 coord_equal() 对齐

ruby 符号作为键,但无法从哈希中获取值

r - 如何在R中获取列表中的最后一个元素

bash - 在变量赋值的 RHS 上引用与不引用变量

python - 使用 Python 将包含双引号的参数传递给子进程

bash - if 语句内的变量替换