gpt4 book ai didi

R : Swapping 2 values in a nested list

转载 作者:行者123 更新时间:2023-12-04 10:44:46 25 4
gpt4 key购买 nike

[[1]]
[[1]][[1]]
[1] 1 46 107 69 1

[[1]][[2]]
[1] 1 146 145 71 92 1
####################
[[2]]
[[2]][[1]]
[1] 1 46 18 92 1

[[2]][[2]]
[1] 1 127 145 53 168 1

假设我有 2 个嵌套列表,如上所示,我正在寻找可以在不改变列表结构

预期的输出是这样的

[[1]]
[[1]][[1]]
[1] 1 92 107 69 1

[[1]][[2]]
[1] 1 146 145 71 46 1
####
[[2]]
[[2]][[1]]
[1] 1 92 18 46 1

[[2]][[2]]
[1] 1 127 145 53 168 1

Rlist 库有像 list.find/list.findi 这样的函数,它只适用于命名嵌套列表。我的不是命名列表

最佳答案

这是实现该目标的另一种方式。首先,您只需将列表转换为矢量 (unlist(l))。进行必要的交换并将其转换回您的列表 (relist(x, skeleton = l))。

x <- unlist(l)
a <- which(x==46)
b <- which(x==92)
x[a] <- 92
x[b] <- 46
relist(x, skeleton = l)

基准测试

library(microbenchmark)
l <- list(list(c(1, 46, 107, 69, 1), c(1, 146, 145, 71, 92, 1)), list(
c(1, 46, 18, 92, 1), c(1, 127, 145, 53, 168, 1)))

f_m0h3n <- function(l){x <- unlist(l);a <- which(x==46);b <- which(x==92);x[a] <- 92;x[b] <- 46;relist(x, l);}
f_jakub <- function(li) rapply(li, function(x) ifelse(x == 46, 92,ifelse(x==92, 46, x)), how = "list")
all.equal(f_m0h3n(l), f_jakub(l))
# [1] TRUE
microbenchmark(f_m0h3n(l), f_jakub(l))

# Unit: microseconds
# expr min lq mean median uq max neval
# f_m0h3n(l) 100.942 103.509 109.7108 107.3580 111.6355 204.879 100
# f_jakub(l) 126.178 131.738 142.8850 137.9405 143.7150 357.148 100

规模更大

library(microbenchmark)
set.seed(123)
l <- list(list(sample(1000), sample(2000)),list(sample(1000), sample(2000)))

all.equal(f_m0h3n(l), f_jakub(l))
# [1] TRUE
microbenchmark(f_m0h3n(l), f_jakub(l))

# Unit: microseconds
# expr min lq mean median uq max neval
# f_m0h3n(l) 588.973 615.0645 896.9371 651.2065 692.268 2827.242 100
# f_jakub(l) 1022.683 1053.9070 1914.0769 1253.0115 2848.842 3287.898 100

很明显,f_m0h3nf_jakub 效果更好。对于更大的尺度,差异甚至更显着(时间几乎减少了一半)。

关于R : Swapping 2 values in a nested list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834755/

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