匹配旧列名并替换为来自另一个数据帧的新列名(+交互)



我有一个数据帧(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"

如有任何帮助,我们将不胜感激。

感谢

我认为简单的循环是最简单的方法:

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"

由reprex包(v0.3.0(创建于2020-12-08