如何避免在 R 中使用嵌套 lapply?

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)

我使用嵌套 lapply 的函数,但想避免这种情况:

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?谁能提出解决这个问题的可能想法?谢谢

此致:

杰夫

Rom*_*man 5

我不确定你真正想要什么。但如果您喜欢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)