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"
任何帮助将不胜感激。
谢谢
解决方案
我认为一个简单的循环是最简单的方法:
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 包于 2020-12-08 创建(v0.3.0)
推荐阅读
- express - CoffeeScript2:语法错误:无法在模块外使用导入语句
- python-3.x - 用 numpy 生成 8 位图像
- c - 为什么我在堆栈中推送数据后数据发生了变化?
- flutter - 照片上的说明文字
- java - 无法实现 Bean 验证 API
- javascript - 如何在javascript变量中使用嵌入代码
- postgresql - pg_restore:错误:输入文件似乎不是有效的存档
- python - 如何使 tkinter 按钮只打开一个顶层?
- javascript - 使用 Puppeteer 在网络抓取中用于不同类型数据的相同选择器
- amazon-web-services - 限制开发者拉取 AWS Amplify 的生产环境