重命名不包含某些列的列

时间:2019-06-11 18:13:38

标签: r dplyr rename

如果列名未包含在名为untouch_vars的字符向量中,我想在数据集中的列上添加前缀。

查看rename_at的帮助页面后,我尝试了以下代码行:

data("iris")
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>% 
  rename_at(vars(-untouch_vars), ~str_c("HEY_", .))

,但由于Foo数据集中不存在Fiiiris,因此无法使用。实际上,我收到以下错误:

Error: Unknown columns `Foo` and `Fii` 
Call `rlang::last_error()` to see a backtrace

由于我有多个数据集,而且我不想为每个数据集创建一个自定义向量,因此要排除这种情况吗?

3 个答案:

答案 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)

由于dplyrFoo中找不到列Fiiiris时出错,因此我们必须找到一种避免寻找它们的方法。尝试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()