如何重命名 data.frames 列表中的重复变量?

问题描述 投票:0回答:1

我想使用

map2
重命名列表中包含的数据表的多个重复变量名称“NA.”,以便列名称不重复。已提出此问题(无法使用 dplyr rename() 和 rename_with() 重命名重复的列名称),但仅适用于使用
dplyr
包的一个数据框。下面是一个玩具示例。

library(data.table)
library(tidyverse)
a <-  data.table(All = rep(c('a', c(1:3))),
                 NA. = rep(c(NA, c(1:3))),
                 NA. = rep(c(NA, c(2:4))))

b <-  data.table(All = rep(c('a', c(1:3))),
                 NA. = rep(c(NA, c(1:3))),
                 NA. = rep(c(NA, c(2:4))),
                 NA. = rep(c(NA, c(3:5))),
                 NA. = rep(c(NA, c(4:6))))
c <- list(a,b)
c
#> [[1]]
#>    All NA. NA.
#> 1:   a  NA  NA
#> 2:   1   1   2
#> 3:   2   2   3
#> 4:   3   3   4
#> 
#> [[2]]
#>    All NA. NA. NA. NA.
#> 1:   a  NA  NA  NA  NA
#> 2:   1   1   2   3   4
#> 3:   2   2   3   4   5
#> 4:   3   3   4   5   6

我能够弄清楚如何使用以下代码使一个 data.table 的变量名称唯一。

d <- make.unique(dput(names(a)))
#> c("All", "NA.", "NA.")
d
#> [1] "All"   "NA."   "NA..1"
names(a) <- d
names(a)
#> [1] "All"   "NA."   "NA..1"

但是,当我尝试使用

map2
包中的
purrr
应用类似的逻辑时,我收到错误。

map(c, ~names(.x) %>% dput %>% make.unique()) -> e
#> c("All", "NA.", "NA.")
#> c("All", "NA.", "NA.", "NA.", "NA.")
e
#> [[1]]
#> [1] "All"   "NA."   "NA..1"
#> 
#> [[2]]
#> [1] "All"   "NA."   "NA..1" "NA..2" "NA..3"
map2(c, e, ~.y ->> names(.x))
#> Error in names(.x) <<- ~.y: object '.x' not found

我尝试使用

setnames
中的
data.table
,但是我收到错误,因为该函数不喜欢使用具有重复列名的数据表。我愿意将
rename_with
map
一起使用,但这个项目的性质意味着我必须首先使变量名称不唯一(它们可能绝对没有意义),然后才能将名称调整为更有意义的名称。现在,我可以使用像“NA..1”这样的变量名称。

我想弄清楚的是如何消除变量名称的重复性,因为涉及数据的所有后续操作都要求变量名称是唯一的。有想法吗?

dplyr data.table purrr
1个回答
0
投票
map(c_dflist, \(x) setnames(x, make.unique(names(x))))

或者删除 purrr 依赖

lapply(c_dflist, \(x) setnames(x, make.unique(names(x))))
© www.soinside.com 2019 - 2024. All rights reserved.