use*_*911 2 performance r function lapply
我正在寻找嵌套 lapply 的有效替代方案,我认为在 R 社区中不赞赏使用嵌套结构。任何人都可以提出可能的想法或方法来避免在自定义函数中使用 Nest lapply 吗?
这是快速可重现的示例:
a <- data.frame(
start=seq(1, by=9, len=18), stop=seq(6, by=9, len=18),
ID=letters[seq(1:18)], score=sample(1:25, 18, replace = FALSE))
b <- data.frame(
start=seq(2, by=11, len=20), stop=seq(8, by=11, len=20),
ID=letters[seq(1:20)], score=sample(1:25, 20, replace = FALSE))
c <- data.frame(
start=seq(4, by=11, len=25), stop=seq(9, by=11, len=25),
ID=letters[seq(1:25)], score=sample(1:25, 25, replace = FALSE))
Run Code Online (Sandbox Code Playgroud)
a.big <- a[a$score >10,]
a.sml <- a[(a$score > 6 & a$score <= 10),]
a.non <- a[a$score < 6,]
a_new <- list('big'=a.big, 'sml'=a.sml)
tar.list <- list(b,c)
test <- lapply(a_new, function(ele_) {
re <- lapply(tar.list, function(li) {
out <- base::setdiff(ele_, li)
return(out)
})
})
Run Code Online (Sandbox Code Playgroud)
避免使用嵌套的 lapply,找到其有效的替代方案。我的意思是为其输出找到更好的表示,它必须易于/快速重现,并允许快速/轻松的下游计算。有什么通用方法可以做到这一点吗?
如何避免在中使用嵌套lapply test?谁能提出解决这个问题的可能想法?谢谢
此致:
杰夫
我不确定你真正想要什么。但如果您喜欢setdiff两个列表的所有组合,那么您可以使用如下所示的内容:
# all combinations
a <- expand.grid(seq_along(a_new), seq_along(tar.list))
a
Var1 Var2
1 1 1
2 2 1
3 1 2
4 2 2
# apply over all combinations setdiff row-vice
apply(a, 1, function(x, y, z){ setdiff(y[x[1]], z[x[2]])}, a_new, tar.list)[1:2]
[[1]]
[[1]][[1]]
start stop ID score
2 10 15 b 21
3 19 24 c 12
6 46 51 f 23
9 73 78 i 15
10 82 87 j 19
11 91 96 k 25
13 109 114 m 11
16 136 141 p 17
17 145 150 q 18
18 154 159 r 24
[[2]]
[[2]][[1]]
start stop ID score
5 37 42 e 9
14 118 123 n 8
15 127 132 o 7
Run Code Online (Sandbox Code Playgroud)
使用双[[]]括号可以让您仅输出一个列表的更清晰的输出。
apply(a, 1, function(x, y, z){ setdiff(y[[x[1]]],z[[x[2]]])}, a_new, tar.list)
[[1]]
start stop ID score
2 10 15 b 21
3 19 24 c 12
6 46 51 f 23
9 73 78 i 15
10 82 87 j 19
11 91 96 k 25
13 109 114 m 11
16 136 141 p 17
17 145 150 q 18
18 154 159 r 24
[[2]]
start stop ID score
5 37 42 e 9
14 118 123 n 8
15 127 132 o 7
[[3]]
start stop ID score
2 10 15 b 21
3 19 24 c 12
6 46 51 f 23
9 73 78 i 15
10 82 87 j 19
11 91 96 k 25
13 109 114 m 11
16 136 141 p 17
17 145 150 q 18
18 154 159 r 24
[[4]]
start stop ID score
5 37 42 e 9
14 118 123 n 8
15 127 132 o 7
Run Code Online (Sandbox Code Playgroud)