【问题标题】:matching old column names and replacing with new from another dataframe (+ interactions)匹配旧列名并替换为来自另一个数据帧的新列名(+ 交互)
【发布时间】:2020-12-09 05:16:11
【问题描述】:

我有一个数据框 (df.subset),它混合了原始变量和相互之间的一些交互作用 (cfr.labs)。我想通过匹配 old 名称并用 new 替换它们来使用外部数据框 (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"

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: r


    【解决方案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"
    

    reprex package (v0.3.0) 于 2020 年 12 月 8 日创建

    【讨论】:

    • 嗨艾伦,感谢您的回复!这回答了这个问题,但我可以请您解释一下循环的作用吗?在任何迭代中(从 1 到 nrow(df_names))我都会得到相同的结果 - 所以我在这里有点困惑。为这个非常愚蠢的问题道歉。
    • @JoeUK seq(nrow(df_names)) 只是一种更安全的做法1:nrow(df_names)。循环的内容只是遍历df_names 的每一行,并将df.subset 名称中old 的任何实例替换为new 的匹配值。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2021-08-31
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多