【发布时间】:2020-10-10 20:43:32
【问题描述】:
我有一个列表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)
})
尽管如此,如果有更简洁的方法,我正在徘徊。更具体地说,我尝试过使用 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() 的限制是否有解决方法?
【问题讨论】: