重命名列,不包括某个特定的列集。

3
如果列名不包含在名为untouch_vars的字符向量中,我想要给我的数据集列添加前缀。查看rename_at的帮助页面后,我尝试了以下代码行:
data("iris")
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>% 
  rename_at(vars(-untouch_vars), ~str_c("HEY_", .))

但是由于 iris 数据集中不存在 FooFii,因此它不起作用。事实上,我会得到以下错误:

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

由于我有多个数据集,并且不想为每个数据集创建一个自定义的需要排除的变量向量,那么有没有办法使我的意图实现?

3个回答

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_", .))

不会有任何警告。


2
总是存在,总是让其他人学习他们不知道的事情!非常感谢,akrun。 - Ric S

2

one_of() 可能是最自然的方法,但也有可能是:

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

1

由于dplyriris中找不到列FooFii时会出错,我们必须找到一种避免查找它们的方法。尝试使用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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接