【问题标题】:R: Add suffix to names of multiple columnsR:为多个列的名称添加后缀
【发布时间】:2020-11-24 23:08:33
【问题描述】:

我需要通过为每列的名称添加相同的后缀来重命名 R 中的几列。我可以通过每次复制重命名函数并替换变量名来做到这一点,但我想使用更优雅的解决方案。

此外,我正在为三个不同的数据框执行此操作,这些数据框都具有我需要重命名的相同列,因此这使我的代码更长。理想情况下,我会将所有这些都放在一个简短的 for 循环或类似的东西中。这是我所拥有的:

# data frames df1, df2, df3, columns a, b, c, and d:
df1 <- rename(df1, "a.df1" = a)
df1 <- rename(df1, "b.df1" = b)
df1 <- rename(df1, "c.df1" = c)
df1 <- rename(df1, "d.df1" = d)

df2 <- rename(df2, "a.df2" = a)
df2 <- rename(df2, "b.df2" = b)
df2 <- rename(df2, "c.df2" = c)
df2 <- rename(df2, "d.df2" = d)

df3 <- rename(df3, "a.df3" = a)
df3 <- rename(df3, "b.df3" = b)
df3 <- rename(df3, "c.df3" = c)
df3 <- rename(df3, "d.df3" = d)

这可以重命名我想要的列,但我希望它看起来更像:

for (i in list(df1, df2, df3)) {
    for (j in c("a", "b", "c", "d")) {
        rename(i, "j.i" = j)
    }
}

我已经尝试了这个循环的几个版本,但无法让它工作。谁有解决办法?

【问题讨论】:

  • 请添加df1dput(df1) 以重现您的问题并为您提供帮助!

标签: r for-loop rename


【解决方案1】:
df1 %>% rename_with(.fn = ~paste0(., ".df1"), .cols = c("a", "b", "c", "d"))

对于多个数据框,应先将它们放在一个列表中。

df_list = list(df1 = df1, df2 = df2, df3 = df3)
for(df_name in names(df_list)) {
  df_list[[df_name]] = df_list[[df_name]] %>%
    rename_with(.fn = ~paste(., df_name, sep = "."), .cols = c("a", "b", "c", "d"))
}

【讨论】:

  • 谢谢!除了两件事之外,这几乎完美无缺:1)我认为您在代码的“for”部分中有错字。应该是:“for(df_name in names(df_list))”。刚刚将“=”切换为“in”2)这会将变量更改为例如“adf1”,而完美的解决方案将导致“a.df1”。知道如何解决这个问题吗?
  • @BrianMurphy 将~paste0(.,df_name) 更改为~paste0(.,".", df_name) 甚至~paste(.,df_name, sep = ".")
【解决方案2】:

您可以使用rename_at 尝试这种方法

df <- data.frame(obs = 1:5, COL_A = 6:10, COL_B = 11:15, COL_C = c(10, NA, 21, NA, 7))

df2 <-  df %>% 
  rename_at(vars(-c("obs")), function(x) paste0(x, "_Your_suffix"))

df2
# obs COL_A_Your_suffix   COL_B_Your_suffix COL_C_Your_suffix
# 1   1                 6                11                10
# 2   2                 7                12                NA
# 3   3                 8                13                21
# 4   4                 9                14                NA
# 5   5                10                15                 7

【讨论】:

    【解决方案3】:

    对于单帧,

    colnms <- c("mpg","disp","cyl")
    colnames(mtcars)[match(colnms, colnames(mtcars))] <- paste0(colnms, "_", 1L)
    mtcars[1:2,]
    #               mpg_1 cyl_1 disp_1  hp drat    wt  qsec vs am gear carb
    # Mazda RX4        21     6    160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag    21     6    160 110  3.9 2.875 17.02  0  1    4    4
    

    在帧列表上重现:

    set.seed(42)
    list_of_frames <- replicate(3, mtcars[1:2,sample(ncol(mtcars))], simplify = FALSE)
    list_of_frames
    # [[1]]
    #               mpg drat carb am cyl  hp  qsec gear vs    wt disp
    # Mazda RX4      21  3.9    4  1   6 110 16.46    4  0 2.620  160
    # Mazda RX4 Wag  21  3.9    4  1   6 110 17.02    4  0 2.875  160
    # [[2]]
    #               vs  qsec  hp mpg drat    wt am cyl gear carb disp
    # Mazda RX4      0 16.46 110  21  3.9 2.620  1   6    4    4  160
    # Mazda RX4 Wag  0 17.02 110  21  3.9 2.875  1   6    4    4  160
    # [[3]]
    #               am carb  hp drat  qsec vs    wt gear cyl disp mpg
    # Mazda RX4      1    4 110  3.9 16.46  0 2.620    4   6  160  21
    # Mazda RX4 Wag  1    4 110  3.9 17.02  0 2.875    4   6  160  21
    
    Map(function(df, num) { 
      colnames(df)[match(colnms, colnames(df))] <- paste0(colnms, "_", num)
      df
    }, list_of_frames, seq_along(list_of_frames))
    # [[1]]
    #               mpg_1 drat carb am cyl_1  hp  qsec gear vs    wt disp_1
    # Mazda RX4        21  3.9    4  1     6 110 16.46    4  0 2.620    160
    # Mazda RX4 Wag    21  3.9    4  1     6 110 17.02    4  0 2.875    160
    # [[2]]
    #               vs  qsec  hp mpg_2 drat    wt am cyl_2 gear carb disp_2
    # Mazda RX4      0 16.46 110    21  3.9 2.620  1     6    4    4    160
    # Mazda RX4 Wag  0 17.02 110    21  3.9 2.875  1     6    4    4    160
    # [[3]]
    #               am carb  hp drat  qsec vs    wt gear cyl_3 disp_3 mpg_3
    # Mazda RX4      1    4 110  3.9 16.46  0 2.620    4     6    160    21
    # Mazda RX4 Wag  1    4 110  3.9 17.02  0 2.875    4     6    160    21
    

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 2016-03-07
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多