【问题标题】:Rename specific colum names in some data frames in a list of data frames with dplyr使用 dplyr 重命名数据框列表中某些数据框中的特定列名
【发布时间】:2020-10-10 20:43:32
【问题描述】:

我有一个列表lst 的四个数据框,它们的标题有一些错误。我需要有选择地将名为cd 的列的名称更改为adate_mmddyyydate_ymd。在我的真实列表中,有 66 个数据框具有不同的列数和不同的列名,但这里有一个小例子:

    df1 <- data.frame(V1 = seq(1:10), V2 = seq(11:20), V3 = c("01/22/2018", "01/23/2018", "01/24/2018", "01/25/2018", "01/26/2018", "01/27/2018", "01/28/2018", "01/29/2018", "01/30/2018", "01/31/2018"))
    df2 <- data.frame(V1 = seq(21:30), V2 = seq(31:40), V3 = c("01/22/2017", "01/23/2017", "01/24/2017", "01/25/2017", "01/26/2017", "01/27/2017", "01/28/2017", "01/29/2017", "01/30/2017", "01/31/2017"))
    df3 <- data.frame(V1 = seq(41:50), V2 = seq(51:60), V3 = c("01/22/2016", "01/23/2016", "01/24/2016", "01/25/2016", "01/26/2016", "01/27/2016", "01/28/2016", "01/29/2016", "01/30/2016", "01/31/2016"))
    df4 <- data.frame(V1 = seq(61:70), V2 = seq(71:80), V3 = c("01/22/2015", "01/23/2015", "01/24/2015", "01/25/2015", "01/26/2015", "01/27/2015", "01/28/2015", "01/29/2015", "01/30/2015", "01/31/2015"))
    
    lst <- list(df1, df2, df3, df4)
    
    headers <- list(c("c", "b", "date_mmddyyy"), c("d", "b", "date_mmddyyy"), c("a", "b", "date_mmddyyy"), c("a", "b", "date_mmddyyy"))

    lst <- lapply(seq(lst), function(i) {
      y <- lst[[i]]
      names(y) <- headers[[i]]
      return(y)
    })

我通过以下方式达到了预期的结果:

lst <- lapply(seq(lst), function(i) {
  y <- lst[[i]]
  names(y)[names(y) == "c"] <- "a"
  names(y)[names(y) == "d"] <- "a"
  names(y)[names(y) == "date_mmddyyy"] <- "date_ymd"
  return(y)
})

尽管如此,如果有更简洁的方法,我正在徘徊。更具体地说,我尝试过使用 dplyr rename() 这样的函数:

 lst <- lapply(seq(lst), function(i) {
  y <- lst[[i]]
  y <- rename(y, a = c, a = d, date_ymd = date_mmddyyy)
  return(y)
})

结果:

Error: Can't rename columns that don't exist.
x Column `c` doesn't exist.

似乎rename() 在到达不包含任何要更改的指定列名的数据框时返回错误。 rename() 的限制是否有解决方法?

【问题讨论】:

    标签: r list dataframe dplyr


    【解决方案1】:

    purrrdplyrstringr 的一个解决方案可能是:

    map(.x = lst,
        ~ .x %>%
         rename_all(~ str_replace_all(., c("\\bc\\b" = "a", 
                                           "\\bd\\b" = "a", 
                                           "\\bdate_mmddyyy\\b" = "date_ymd"))))
    
    
    [[1]]
        a  b   date_ymd
    1   1  1 01/22/2018
    2   2  2 01/23/2018
    3   3  3 01/24/2018
    4   4  4 01/25/2018
    5   5  5 01/26/2018
    6   6  6 01/27/2018
    7   7  7 01/28/2018
    8   8  8 01/29/2018
    9   9  9 01/30/2018
    10 10 10 01/31/2018
    
    [[2]]
        a  b   date_ymd
    1   1  1 01/22/2017
    2   2  2 01/23/2017
    3   3  3 01/24/2017
    4   4  4 01/25/2017
    5   5  5 01/26/2017
    6   6  6 01/27/2017
    7   7  7 01/28/2017
    8   8  8 01/29/2017
    9   9  9 01/30/2017
    10 10 10 01/31/2017
    
    [[3]]
        a  b   date_ymd
    1   1  1 01/22/2016
    2   2  2 01/23/2016
    3   3  3 01/24/2016
    4   4  4 01/25/2016
    5   5  5 01/26/2016
    6   6  6 01/27/2016
    7   7  7 01/28/2016
    8   8  8 01/29/2016
    9   9  9 01/30/2016
    10 10 10 01/31/2016
    
    [[4]]
        a  b   date_ymd
    1   1  1 01/22/2015
    2   2  2 01/23/2015
    3   3  3 01/24/2015
    4   4  4 01/25/2015
    5   5  5 01/26/2015
    6   6  6 01/27/2015
    7   7  7 01/28/2015
    8   8  8 01/29/2015
    9   9  9 01/30/2015
    10 10 10 01/31/2015
    

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 2021-10-08
      • 2021-01-03
      • 2017-12-28
      • 1970-01-01
      • 2018-06-06
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多