如果数据集的列名称不包含在名为untouch_vars
的字符矢量中,我希望为这些列添加前缀。
在查看了rename_at
的帮助页面后,我尝试了以下几行代码:
data("iris")
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>%
rename_at(vars(-untouch_vars), ~str_c("HEY_", .))
但它不起作用,因为iris
数据集中不存在Foo
和Fii
。实际上,我得到了以下错误:
Error: Unknown columns `Foo` and `Fii`
Call `rlang::last_error()` to see a backtrace
由于我有几个数据集,并且我不想为每个数据集创建要排除的变量的自定义向量,有没有办法实现我的意图?
发布于 2019-06-12 02:14:51
我们可以使用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_", .))
不会有任何警告
发布于 2019-06-12 02:25:31
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
发布于 2019-06-12 03:29:43
因为当dplyr
在iris
中找不到列Foo
和Fii
时会出错,所以我们必须找到一种方法来避免查找它们。试试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()
https://stackoverflow.com/questions/56549548
复制相似问题