【问题标题】:Loop over list of data frames and rename column names In R循环数据框列表并重命名R中的列名
【发布时间】:2019-10-18 12:59:55
【问题描述】:

我确实想遍历我拥有的数据框列表并重命名列名。这是数据帧的示例,

dput(df)
df1 <- structure(list(v1..x = c("Silva", "Brandon", "Mango"),
               t2.v = c("James","Jane", "Egg")),
          class = "data.frame", row.names = c(NA,  -3L))

dput(df2)
df2 <- structure(list(v1..x = c("Silva", "Brandon", "Mango"),
               t2.r = c("James","Jane", "Egg")),
          class = "data.frame", row.names = c(NA,  -3L))
dput(df3)
df3 <- structure(list(v1..x = c("Silva", "Brandon", "Mango"),
               t2.v = c("James","Jane", "Egg"),
               d3...c = c("James","Jane", "Egg")),
          class = "data.frame", row.names = c(NA,  -3L))

我想遍历此数据框列表并重命名列。我有一个要替换的列列表,我确实喜欢使用 setnames 以便跳过缺少的列,以防它在数据框中找到一个列。这是我尝试过的,但只更改了第一列

lst_df <- list(df1,df2,df3)
oldnames<- c('v1..x','t2.v','d3...c')
newnames <- c('v1','t2_v','d3')
lst <- lapply(lst_df, function(x) setNames(x, gsub(oldnames, newnames, names(x))) )

注意某些数据框中的列可能长度不同。请帮助

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    在这种情况下,data.table 可能会派上用场。它的setnames 功能比setNames 更灵活。

    library(data.table)
    oldnames<- c('v1..x','t2.v','d3...c')
    newnames <- c('v1','t2_v','d3')
    
    # convert df-s to data.table
    lapply(lst_df, setDT)
    # setnames function from data.table is quite flexible
    lapply(lst_df, setnames, oldnames, newnames, skip_absent = TRUE)
    

    考虑到这只会改变完全匹配。如果您想更改这些字符串模式,最简单的方法可能是运行 for 并使用正则表达式。

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 1970-01-01
      • 2018-12-21
      • 2021-12-03
      • 2022-11-07
      • 1970-01-01
      • 2018-09-28
      • 2014-11-22
      • 1970-01-01
      相关资源
      最近更新 更多