【问题标题】:Change columns in several dfs depending on name of df in a loop (R)根据循环中 df 的名称更改几个 dfs 中的列(R)
【发布时间】:2020-03-04 13:53:37
【问题描述】:

我想在一个循环中更改几个df中的列名,其中新的列名取决于df的名称:

library(dplyr)

# A simple example of my data:
dataframe_AA <- data.frame(
  var1 = sample(1:3),
  var2 = sample(1:3),
  var3 = sample(1:3))

dataframe_AB <- data.frame(
  var1 = sample(1:3),
  var2 = sample(1:3),
  var3 = sample(1:3))


dfs <- list(dataframe_AA, dataframe_AB)
combinations <- c("AA", "AB")
oldnames = c("var1", "var2", "var3")

for (df in seq_along(dfs)) {
  for (combi in combinations) {
    newnames = paste(oldnames, substr = substring(combi,1,2), sep = "_")
    df <- df %>% rename_at(vars(oldnames), ~newnames)
  }
  }



#Expected outcome:
names(dataframe_AA)
[1] "var1_AA" "var2_AA" "var3_AA"

names(dataframe_AB)
[1] "var1_AB" "var2_AB" "var3_AB"

newnames 在循环内成功创建,但随后我收到错误消息:Error in UseMethod("tbl_vars") : no applicable method for 'tbl_vars' applied to an object of class "c('integer', 'numeric')"

但是,在循环之外执行所有操作都可以:

df = dataframe_AA
combi = "AA"
newnames = paste(oldnames, substr = substring(combi,1,2), sep = "_")
df <- df %>% rename_at(vars(oldnames), ~newnames)

print(names(df))
[1] "var1_AA" "var2_AA" "var3_AA"


我不明白我在这里做错了什么以及如何让它循环工作。

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    我们可以使用mget 获取列表中的数据框,然后根据数据框的名称粘贴新变量。

    library(dplyr)
    library(purrr)
    
    
    
    temp <- imap(mget(ls(pattern = "dataframe_.*")), function(x, y) 
              x %>% rename_at(vars(oldnames), ~paste0(., sub(".*_", "_", y))))
    

    temp 是更改名称的数据帧列表,要获取全局环境中的各个数据帧,我们可以使用list2env

    list2env(temp, .GlobalEnv)
    
    names(dataframe_AA)
    #[1] "var1_AA" "var2_AA" "var3_AA"
    names(dataframe_AB)
    #[1] "var1_AB" "var2_AB" "var3_AB"
    

    【讨论】:

    • 非常感谢您的回答。不幸的是,我收到错误Error: Can't subset columns that don't exist. x The columns var1, var2, var3`不存在。`
    • @JuliaP。在这种情况下,请提供您的数据reproducible example
    • 啊,当然。我做了一个编辑。希望它变得像这样更清楚。
    • @JuliaP。谢谢你,提供一个例子。这是一个范围界定问题。我使用匿名函数来解决这个问题。更新了答案,你现在可以查看。
    • 非常感谢您的帮助!它完美地工作。除了dplyr 之外,我只需要添加library(purrr) 即可使其工作。
    猜你喜欢
    • 2022-12-07
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多