我目前有一个包含大约 5000 个元素的大列表。一个可重现的例子是:
List.5000 <- replicate(5000, c(list(A='A',value.A=10),list(B='B',value.B=20)), simplify = F)
其中有:
> List.5000
[[1]]
[[1]]$A
[1] "A"
[[1]]$value.A
[1] 10
[[1]]$B
[1] "B"
[[1]]$value.B
[1] 20
[[2]]
[[2]]$A
[1] "A"
[[2]]$value.A
[1] 10
[[2]]$B
[1] "B"
[[2]]$value.B
[1] 20
....
当我调用
names(List.5000)
它返回 NULL
.但是当我调用 names(List.5000[[1]])
, 它给:"A" "value.A" "B" "value.B"
我想改名
"B"
至"Z"
.有没有办法做到这一点而无需创建一个新列表,然后循环和重建?
最佳答案
for(i in seq_along(List.5000))
names(List.5000[[i]])[names(List.5000[[i]]) == 'B'] <- 'Z'
或者,如果您喜欢
lapply
/map
:List.5000 <- lapply(List.5000,
function(x) {names(x)[names(x) == 'B'] <- 'Z'; x})
library(purrr)
List.5000 <- map(List.5000, ~{names(.)[names(.) == 'B'] <- 'Z'; .})
如果名字真的都一样,你可以这样做
ind <- names(List.5000[[1]]) == 'B'
for(i in seq_along(List.5000))
names(List.5000[[i]])[ind] <- 'Z'
括号语法要快一点:
x <- List.5000[[1]]
microbenchmark(
sub = names(x) <- sub("^B$", "Z", names(x))
, ifelse = names(x) <- ifelse(names(x) == 'B', 'Z', names(x))
, stringi = names(x) <- str_replace(names(x), "^B$", "Z")
, replace = names(x) <- replace(names(x), names(x) == 'B', 'Z')
, bracket = names(x)[names(x) == 'B'] <- 'Z'
)
# Unit: microseconds
# expr min lq mean median uq max neval
# sub 22.041 31.2265 58.24097 46.9650 78.5075 373.637 100
# ifelse 13.309 22.4110 44.00665 30.2235 65.1395 113.693 100
# stringi 153.880 313.0400 346.41543 358.4795 383.4130 631.354 100
# replace 4.067 6.3205 13.09022 8.1760 11.9280 54.075 100
# bracket 3.246 4.5265 10.38177 5.9180 7.9925 55.278 100
仍然有点不满意,因为这些方法都没有修改列表。
关于r - 如何在R中以有效的方式重命名列表列表中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663249/