gpt4 book ai didi

r - 如何在R中以有效的方式重命名列表列表中的元素?

转载 作者:行者123 更新时间:2023-12-03 15:24:52 26 4
gpt4 key购买 nike

我目前有一个包含大约 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com