在 for 循环中为列名添加编号前缀

Adding a numbered prefix to column names in a for loop

我有 50 个数据框,它们都具有相同的列名(例如 df1:colnames = Id、A、B、C、D、df2:colnames = ID、A、B、C、D 等等)。

我需要重命名它们,使其成为 df1: colnames = ID, Mth1_A, Mth1_B, Mth1_C, Mth1_D 然后 df2: ID, Mth2_A、Mth2_B、Mth2_C、Mth2_D。所以每个列名应该对应数据帧的编号。

我已经创建了一个函数来执行此操作;

col_prefix <- function(df, Mth){
  colnames(df)[2:ncol(df)] <- paste("Mth", colnames(df)[2:ncol(df)], sep = "_")
  return(df)
}

但我现在正在尝试创建一个循环来为所有 50 个执行此操作,但我无法让它工作。这是我到目前为止所得到的

dfList <- c("df1", "df2",...,"df50")

for (filename in dfList){
  i <- get(filename)
  i <- col_prefix(i, Mth)
}

它向数据场添加了前缀“Mth”,但没有执行“Mth1”、“Mth2”等。我很确定这是因为在我的函数中 Mth 是一个字符,但我不知道如何循环。

请帮忙!

将它们放在一个列表中,并使用它们的名称(df1、df2 等...)来捕获前缀, 即

l1 <- mget(grep(pattern = "df[0-9]+", x = ls(), value = TRUE))
Map(function(x, y) setNames(x, paste0('MTH', gsub('\D+', '', y), '_', names(x))), 
    l1, names(l1))

$df1
  MTH1_v1 MTH1_v2
1       5       9
2       6      10
3       7      11

$df2
  MTH2_v1 MTH2_v2
1      15      19
2      16     110
3      17     111

要更改除第一个以外的所有名称,

Map(function(x, y) data.frame(x[1], setNames(x[-1], paste0('MTH', gsub('\D+', '', y), '_', names(x)[-1]))), l1, names(l1))

$df1
  v1 MTH1_v2
1  5       9
2  6      10
3  7      11

$df2
  v1 MTH2_v2
1 15      19
2 16     110
3 17     111

数据

dput(df1)
structure(list(v1 = c(5, 6, 7), v2 = c(9, 10, 11)), class = "data.frame", row.names = c(NA, 
-3L))
dput(df2)
structure(list(v1 = c(15, 16, 17), v2 = c(19, 110, 111)), class = "data.frame", row.names = c(NA, 
-3L))