我有一个函数,用于操作从各种来源获得的数据,其中包含许多手动输入字段。由于我不知道这些文件中使用的布局或命名约定会发生什么,我希望它在数据帧中"扫描"字符串为"fix"、"name"或"agent"的列,并将该列变异为名称为"Firm"的新列,然后对该列的条目进行字符串清理,最后删除原始列。我已经让它与我已经使用过的一些CSV一起工作,但现在遇到了这样的错误:只有字符串可以转换为符号。我已签入此线程错误:只有字符串可以转换为符号,但无效。
这是目前的功能:
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()
返回单个索引。可能需要额外的代码来处理多个匹配。(