问题描述
我的数据如下所示:
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))