сопоставление старых имен столбцов и замена на новые из другого фрейма данных ( взаимодействия)

#r

#r

Вопрос:

У меня есть фрейм данных ( df.subset ), который представляет собой смесь исходных переменных и некоторых взаимодействий друг с другом (cfr. labs ). Я хочу переименовать столбцы с помощью внешнего фрейма данных ( df_names ), сопоставив старые имена и заменив их новыми (предупреждение: взаимодействия тоже должны быть переименованы!).

 set.seed(12345)

x1<- rnorm(100, 1000, 10)
x2<- rnorm(100, 200,1)
x3<- rnorm(100, 10000,400)
x4<- rnorm(100, 2405,28)

# starting dataframe
df<-data.frame(cbind(x1,x2,x3,x4))

# i'm interested only in the variables and interactions contained in labs
labs<-c("x1", "x2", "x3", "x4", "x1*x2", "x1*x4", "x2*x3")
str(labs)

# all variables   all interactions
res <- cbind(df, do.call(cbind,combn(colnames(df), 2, 
                                        FUN= function(x) list(df[x[1]]*df[x[2]]))))

colnames(res)[-(seq_len(ncol(df)))] <-  combn(colnames(df), 2, 
                                               FUN = paste, collapse="*")

res

# final dataset
df.subset <- res[, labs]
df.subset

# use this df for new column names
df_names <- data.frame(old = c("x1","x2","x3","x4","x5")
                       , new = c("tv", "radio", "outdoor", "cinema","something_else"))

df_names
 

Я пытался, mapvalues но безуспешно

 plyr::mapvalues(names(df.subset), from = df_names$old, to = df_names$new)
 

Результат должен быть таким, как показано ниже:

 > colnames(df.subset)
[1] "tv"    "radio"    "outdoor"    "cinema"    "tv*radio" "tv*cinema" "radio*outdoor"
 

Любая помощь будет очень признательна.

Спасибо

Ответ №1:

Я думаю, что простой цикл — это самый простой способ сделать это:

 names(df.subset)
#> [1] "x1"    "x2"    "x3"    "x4"    "x1*x2" "x1*x4" "x2*x3"

for(i in seq(nrow(df_names))){
  names(df.subset) <- gsub(df_names$old[i], df_names$new[i], names(df.subset))
}

names(df.subset)
#> [1] "tv"            "radio"         "outdoor"       "cinema"       
#> [5] "tv*radio"      "tv*cinema"     "radio*outdoor"
 

Создано 2020-12-08 пакетом reprex (версия 0.3.0)

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

1. Привет, Аллан, спасибо за ваш ответ! Это отвечает на вопрос, но могу ли я попросить вас объяснить, что делает цикл? на любой итерации (от 1 до nrow(df_names)) Я получаю те же результаты — так что я здесь немного смущен. Извиняюсь за очень глупый вопрос.

2. @JoeUK seq(nrow(df_names)) — это просто более безопасный способ сделать 1:nrow(df_names) . Содержимое цикла просто перебирает каждую строку df_names и заменяет любые экземпляры old в именах df.subset на соответствующее значение new .