#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