我想使用
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”这样的变量名称。
我想弄清楚的是如何消除变量名称的重复性,因为涉及数据的所有后续操作都要求变量名称是唯一的。有想法吗?
map(c_dflist, \(x) setnames(x, make.unique(names(x))))
或者删除 purrr 依赖
lapply(c_dflist, \(x) setnames(x, make.unique(names(x))))