У меня есть список 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()
?