Как присвоить значения в одном столбце другим столбцам в широких данных с помощью R

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

Существует широкий набор данных, простой пример

 df<-data.frame("id"=c(1:6),
           "ax"=c(1,2,2,3,4,4),
           "bx"=c(7,8,8,9,10,10),
           "cx"=c(11,12,12,13,14,14))
  

Я ищу способ присвоить значения в «ax» столбцам «bx» и «cx». Здесь представьте, что у нас есть тысячи столбцов, которые мы намерены заменить на «ax», поэтому я хочу, чтобы это было сделано в автоматическом подходе с использованием R. Ожидаемый результат выглядит следующим образом

 df<-data.frame("id"=c(1:6),
           "ax"=c(1,2,2,3,4,4),
           "bx"=c(1,2,2,3,4,4),
           "cx"=c(1,2,2,3,4,4))
  

Я думал и пытался использовать mutate_at и ends_with, но у меня это не сработало. Например, я попытался

 df %>% 
 mutate_at(vars(ends_with("x")), labels = "ax") 
  

и это выводит ошибку. Не уверен, что не так или что нужно добавить, чтобы это заработало, поэтому я хотел бы попросить вашей помощи в этом. Большое вам спасибо!

Ответ №1:

Простой способ с использованием базового R был бы :

 change_cols <- grep('x$', names(df))
df[change_cols] <- df$ax
df

#  id ax bx cx
#1  1  1  1  1
#2  2  2  2  2
#3  3  2  2  2
#4  4  3  3  3
#5  5  4  4  4
#6  6  4  4  4
  

Комментарии:

1. Спасибо! Как я уже упоминал, есть тысячи столбцов, поэтому я не хочу продолжать вводить метки столбцов в моем коде. Как я могу избежать этого?

2. Вы можете выбирать столбцы с помощью grep . Здесь я использовал шаблон для столбцов, которые заканчиваются на «x».

3. Также df[endsWith(names(df), "x")] <- df$ax в базе R в эти дни.

Ответ №2:

Я бы предложил этот tidyverse подход, используя across() для выбора диапазона переменных, который вы хотите:

 library(tidyverse)
#Data
df<-data.frame("id"=c(1:6),
               "ax"=c(1,2,2,3,4,4),
               "bx"=c(7,8,8,9,10,10),
               "cx"=c(11,12,12,13,14,14))
#Mutate
df %>% mutate(across(c(bx:cx), ~ ax))
  

Вывод:

   id ax bx cx
1  1  1  1  1
2  2  2  2  2
3  3  2  2  2
4  4  3  3  3
5  5  4  4  4
6  6  4  4  4
  

Ответ №3:

Другой вариант с mutate_at()

 df %>% 
  mutate_at(vars(matches("x$")), ~ax)
#   id ax bx cx
# 1  1  1  1  1
# 2  2  2  2  2
# 3  3  2  2  2
# 4  4  3  3  3
# 5  5  4  4  4
# 6  6  4  4  4