【问题标题】:Adding a numbered prefix to column names in a for loop在 for 循环中为列名添加编号前缀
【发布时间】:2021-12-24 16:13:47
【问题描述】:

我有 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。所以每个列名应该对应dataframe的编号。

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

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 是一个字符,但我不知道如何循环这个。

请帮忙!

【问题讨论】:

  • 首先,不要在代码中使用get(也不要使用assign)。与其拥有单独的 data.frames,不如拥有一个 data.frames 列表(或一个大的 data.frames)。然后替换变得微不足道。

标签: r loops multiple-columns prefix


【解决方案1】:

将它们放在一个列表中并使用它们的名称(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))

【讨论】:

  • 谢谢,我已经让它工作了,但我需要第一列不要更改,因为它是我需要保持原样的 ID。所以我需要 df1 colnames: ID、MTH1_v1、MTH1_v2 等,然后是 df2 colnames ID、MTH2_v1、MTH2_v2。抱歉,我不知道如何更改您的代码来做到这一点!
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多