使用dplyr::rename_at配合stringr::str_replace重命名列时报错如何解决?
报错原因
dplyr::rename_at() 要求第三个参数传入一个接收列名字符串向量为输入的函数对象,你直接写stringr::str_replace(., pattern = 'pre', replacement ='PRE')时,代码会先执行str_replace调用:这里的.会被解析为管道传入的整个tibble对象,而非列名字符串,返回的结果既不是函数也不符合rename_at的参数要求,因此触发报错。
而toupper可以直接运行的原因是你传入的是函数本身,rename_at会自动将匹配到的列名向量传入toupper执行重命名。
解决方法
只需要将str_replace调用用匿名函数包裹,传递给rename_at即可,有两种常用写法:
写法1:基础匿名函数
test <- tibble::tribble(~pre_a, ~pre_b, ~c, 1,2,3, 4,5,6) test %>% dplyr::rename_at(dplyr::vars(starts_with('pre')), function(col_name) stringr::str_replace(col_name, pattern = 'pre', replacement = 'PRE'))
写法2:purrr风格公式简写
test %>% dplyr::rename_at(dplyr::vars(starts_with('pre')), ~stringr::str_replace(.x, pattern = 'pre', replacement = 'PRE'))
适配新版dplyr的推荐写法
目前dplyr已经将rename_at系列函数列为软弃用状态,更推荐用rename_with实现相同需求,参数逻辑更清晰:
test %>% dplyr::rename_with( .fn = ~stringr::str_replace(.x, pattern = 'pre', replacement = 'PRE'), .cols = dplyr::vars(starts_with('pre')) )
内容的提问来源于stack exchange,提问作者Sapiens
相关产品推荐
相关产品推荐

