mutate_at () для переименования нескольких переменных без изменения исходных столбцов - PullRequest
0 голосов
/ 23 апреля 2020

Я хотел бы изменить несколько переменных одновременно, используя mutate_at (). Это то, что я делал до сих пор, но так как я имею дело с длинным списком переменных для перекодирования / переименования, я хочу знать, как я могу это сделать с помощью mutate_at (). Я хочу сохранить исходные столбцы, поэтому я не использую rename (), а вместо этого mutate (). Это то, что я обычно делаю:

df <- df %>% 
mutate(q_50_a = as.numeric(`question_50_part_a: very long very long very long very long` == "yes"),
       q_50_b = as.numeric(`question_50_part_b: very long very long very long very long` == "yes"),
       q_50_c = as.numeric(`question_50_part_c: very long very long very long very long` == "yes"))

Это то, что я имею до сих пор:

df <- df %>% mutate_at(vars(starts_with("question_50")), funs(q_50 = as.numeric(. == "yes")))

Это работает и создает новую переменную Numberri c, но я не уверен как заставить его переименовывать новые переменные следующим образом: q_50_a, q_50_b, q_50_ c, т. д.

Спасибо.

edit: так выглядят данные (кроме Есть еще много столбцов, которые выглядят одинаково)

question_50_part_a: a very long title   question_50_part_b: a very long title
yes                                               yes
yes                                               no
yes                                               no
yes                                               yes
no                                                no
yes                                               yes

, но хотелось бы вот что:

q_50_a   q_50_b
1         1
1         0
1         0
1         1
0         0
1         1

, но я хочу сохранить исходные столбцы такими, какие они есть, и просто изменить эти новые столбцы с более коротким именем и цифрой c двоичное кодирование.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вот подход, который зацикливается на каждом столбце:

column_names = colnames(df)
# optional filter out column names you don't want to change here

for(col in column_names){
   # construct replacement name
   col_replace = paste0("q_", substr(col, 10, 11), "_", substr(col, 18, 18))
   # assign and drop old column
   df = df %>%
      mutate(!!sym(col_replace) := ifelse(!!sym(col) == "yes", 1, 0)) %>%
      select(-!!sym(col))
}

Примечания:

  • Если у вас есть другие столбцы, которые вы не хотите менять, обязательно исключить их
  • Конструкция !!sym(col) берет текстовую строку, хранящуюся в col, и превращает ее в имя столбца.
  • Мы используем := вместо =, потому что LHS требует некоторая оценка до того, как может произойти присвоение.
  • Я использовал ifelse вместо as.numeric, но вы можете кодировать RHS знака равенства по своему усмотрению.
  • создание col_replace делает некоторые предположения о формате ваших входных имен. Если все одинаковой длины, это должно работать. Если количество символов отличается (например, Q_9_a и Q_10_a), вы можете использовать вместо этого метод, основанный на strsplit.
  • Выбор знака - делает его исключающим указанный столбец
0 голосов
/ 23 апреля 2020

Мы можем использовать rename_at для переименования новых столбцов.

library(dplyr)

df %>%
  mutate_at(vars(starts_with('question_50')), 
                    list(new = ~as.numeric(. == 'yes'))) %>%
  rename_at(vars(ends_with('new')), 
                   ~sub('\\w+(_\\d+)_part(\\w+):.*', 'q\\1\\2',  .))



#     question_50_part_a: a very long title question_50_part_b: a very long title
#1                                   yes                                   yes
#2                                   yes                                    no
#3                                   yes                                    no
#4                                   yes                                   yes
#5                                    no                                    no
#6                                   yes                                   yes

#  q_50_a q_50_b
#1      1      1
#2      1      0
#3      1      0
#4      1      1
#5      0      0
#6      1      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...