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

Renaming entries of a list within a list, by using a vector containing the column names

我的数据如下:

DT1 <- structure(list(Province = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3), Year = c(2000, 
2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002, 2000, 2000, 2000, 
2001, 2001, 2001, 2002, 2002, 2002, 2000, 2000, 2000, 2001, 2001, 
2001, 2002, 2002, 2002), Municipality = c("Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing", "Something", "Anything", "Nothing", "Something", "Anything", 
"Nothing"), Values = c(0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 
0.85, 0.99, 0.59, 0.58, 0.66, 0.53, 0.94, 0.2, 0.86, 0.85, 0.99, 
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)

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

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","newname2","newname3")

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

您可以使用 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))

你可以使用 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, 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)

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 

...