Переименовать указанные c имена столбцов в некоторых фреймах данных в списке фреймов данных с помощью dplyr - PullRequest
2 голосов
/ 20 июня 2020

У меня есть список lst четырех кадров данных с некоторыми ошибками в заголовках. Мне нужно выборочно изменить имена столбцов с именами c и d на a и date_mmddyyy на date_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)
})
* 1012. * Тем не менее, я блуждал, если есть более краткий способ сделать это. В частности, я пробовал использовать функцию 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() возвращает ошибку, когда достигает данных frame, что он не содержит ни одного из указанных имен столбцов, которые нужно изменить. Есть ли способ обойти это ограничение rename()?

1 Ответ

1 голос
/ 20 июня 2020

Одно решение purrr, dplyr и stringr может быть:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...