通过使用包含列名的向量重命名列表中列表的条目

问题描述

我的数据如下所示:

DT1 <- structure(list(Province = c(1,1,2,3,3),Year = c(2000,2000,2001,2002,2002),Municipality = c("Something","Anything","nothing","Something","nothing"),Values = c(0.59,0.58,0.66,0.53,0.94,0.2,0.86,0.85,0.99,0.59,0.99)),row.names = c(NA,-27L),class = c("tbl_df","tbl","data.frame"))
DT1_list <- DT1%>%
  group_split(Province,Year)

我想使用如下向量重命名所有列:

colnames <- c("newname1","newname2","newname3","newname4")

for (i in DT1_list) {
    names(DT1_list)[[i]] <- colnames
    }

问题是 names(DT1_list)[[i]] 没有给出列名而是 NULL

这样做的正确方法是什么?

编辑:

我注意到我的问题并不能很好地代表我的实际问题(抱歉,我没有预见到这个问题)。我的实际问题是我想重命名 4 列中的 3 列:

colnames <- c("newname1","newname3")

如果我使用提供的答案,第四列变为 NA。无论如何要保持其他列完好无损?

解决方法

您可以使用 purrr:map

library(purrr)                                                                                                                                                              0.59,0.58,0.66,0.53,0.94,0.2,0.86,0.85,0.99)),row.names = c(NA,-27L),class = c("tbl_df","tbl","data.frame"))
DT1_list <- DT1%>%
  group_split(Province,Year)

library(purrr)                                                                                                                                                              0.59,Year)

DT1_list %>% map(~{colnames <- colnames(.x)
                   #You could also use str_replace
                   #colnames <- stringr::str_replace(colnames,"Values","NewValues")
                   colnames[1:3] <- c("newname1","newname2","newname3")
                   colnames(.x)<- colnames
                   .x})

[[1]]
# A tibble: 3 x 4
  newname1 newname2 newname3  Values
     <dbl>    <dbl> <chr>      <dbl>
1        1     2000 Something  0.59 
2        1     2000 Anything   0.580
3        1     2000 Nothing    0.66 

[[2]]
# A tibble: 3 x 4
  newname1 newname2 newname3  Values
     <dbl>    <dbl> <chr>      <dbl>
1        1     2001 Something   0.53
2        1     2001 Anything    0.94
3        1     2001 Nothing     0.2 

...
,

您可以使用 lapply/map :

lapply(DT1_list,setNames,colnames)

#[[1]]
# A tibble: 3 x 4
#  newname1 newname2 newname3  newname4
#     <dbl>    <dbl> <chr>        <dbl>
#1        1     2000 Something    0.59 
#2        1     2000 Anything     0.580
#3        1     2000 Nothing      0.66 

#[[2]]
# A tibble: 3 x 4
#  newname1 newname2 newname3  newname4
#     <dbl>    <dbl> <chr>        <dbl>
#1        1     2001 Something     0.53
#2        1     2001 Anything      0.94
#3        1     2001 Nothing       0.2 
#...
#...

当您想重命名的列数少于原始数据时,请使用:

inds <- seq_along(colnames)
lapply(DT1_list,function(x) {names(x)[inds] <- colnames;x})

或者:

library(dplyr)
library(purrr)

map(DT1_list,~.x %>% rename_with(~colnames,inds))