如果列名未包含在名为untouch_vars
的字符向量中,我想在数据集中的列上添加前缀。
查看rename_at
的帮助页面后,我尝试了以下代码行:
data("iris")
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>%
rename_at(vars(-untouch_vars), ~str_c("HEY_", .))
,但由于Foo
数据集中不存在Fii
和iris
,因此无法使用。实际上,我收到以下错误:
Error: Unknown columns `Foo` and `Fii`
Call `rlang::last_error()` to see a backtrace
由于我有多个数据集,而且我不想为每个数据集创建一个自定义向量,因此要排除这种情况吗?
答案 0 :(得分:4)
我们可以使用one_of
iris %>%
rename_at(vars(-one_of(untouch_vars)), ~ str_c("HEY_", .)) %>%
head(2)
# Sepal.Length HEY_Sepal.Width HEY_Petal.Length HEY_Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#2 4.9 3.0 1.4 0.2 setosa
将会出现未知列'foo','Fii'的警告消息
或带有setdiff
iris %>%
rename_at(vars(setdiff(names(.), untouch_vars)), ~str_c("HEY_", .))
不会有任何警告
答案 1 :(得分:2)
one_of()
可能是最自然的方式,但是,可能也是:
iris %>%
rename_at(vars(which(!names(.) %in% untouch_vars)), ~ str_c("HEY_", .)) %>%
head(2)
Sepal.Length HEY_Sepal.Width HEY_Petal.Length HEY_Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
答案 2 :(得分:1)
由于dplyr
在Foo
中找不到列Fii
和iris
时出错,因此我们必须找到一种避免寻找它们的方法。尝试dplyr::setdiff()
:
library(dplyr)
library(stringr)
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>%
rename_at(setdiff(names(.), untouch_vars), ~str_c("HEY_", .)) %>%
names()