首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重命名不包括特定列集的列

重命名不包括特定列集的列
EN

Stack Overflow用户
提问于 2019-06-12 02:13:39
回答 3查看 123关注 0票数 3

如果数据集的列名称不包含在名为untouch_vars的字符矢量中,我希望为这些列添加前缀。

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

代码语言:javascript
复制
data("iris")
untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")
iris %>% 
  rename_at(vars(-untouch_vars), ~str_c("HEY_", .))

但它不起作用,因为iris数据集中不存在FooFii。实际上,我得到了以下错误:

代码语言:javascript
复制
Error: Unknown columns `Foo` and `Fii` 
Call `rlang::last_error()` to see a backtrace

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-12 02:14:51

我们可以使用one_of中的任何一种

代码语言:javascript
复制
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

代码语言:javascript
复制
iris %>% 
   rename_at(vars(setdiff(names(.), untouch_vars)), ~str_c("HEY_", .))

不会有任何警告

票数 4
EN

Stack Overflow用户

发布于 2019-06-12 02:25:31

one_of()可能是最自然的方式,然而,也可能是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-06-12 03:29:43

因为当dplyriris中找不到列FooFii时会出错,所以我们必须找到一种方法来避免查找它们。试试dplyr::setdiff()

代码语言:javascript
复制
library(dplyr)
library(stringr)

untouch_vars <- c("Sepal.Length", "Species", "Foo", "Fii")

iris %>% 
  rename_at(setdiff(names(.), untouch_vars), ~str_c("HEY_", .)) %>% 
  names()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56549548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档