Переименование столбцов, исключая определенный набор столбцов - PullRequest
3 голосов
/ 11 июня 2019

Я хотел бы добавить префикс к столбцам моего набора данных, если имена столбцов не содержатся в символьном векторе с именем 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

Поскольку у меня есть несколько наборов данных, и я не хочу создавать собственный вектор переменных, которые должны быть исключены для каждой из них, есть ли способ заставить мое намерение произойти?

Ответы [ 3 ]

4 голосов
/ 11 июня 2019

Мы можем использовать либо 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 голосов
/ 11 июня 2019

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 голос
/ 11 июня 2019

Поскольку 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()
...