循环遍历数据框列表并重命名R中的列名

时间:2019-10-18 12:59:55

标签: r dataframe

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

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 来跳过缺少的列,以防万一在数据帧中找到一个列。这是我尝试的方法,但只更改了第一列< / p>

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))) )

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

1 个答案:

答案 0 :(得分:0)

在这种情况下,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并使用正则表达式。