R 中两个以上列表的比较

Comparisons of more than two lists in R

提问人:Atharva Sunil Sathe 提问时间:12/7/2022 更新时间:12/7/2022 访问量:49

问:

对于我的问题,我有 4 个列表,每个列表包含 10,000 个元素。设列表为 a、b、c、d。我可以通过执行均值运算来计算概率(a<b)。如果我理解正确的话,它会按顺序比较 a 和 b 中的 10,000 个元素中的每一个,并告诉我 a<b 包含多少个元素(数字除以元素总数)。mean(a<b)

现在,我想计算概率(a<b<c<d)。我想按顺序比较 10,000 个元素,并告诉我 (a<b<c<d) 包含多少个元素。但是,我无法使用 mean 函数来做到这一点,因为它不接受多个符号。如何在此处使用均值函数?我是 r 的绝对初学者,但从逻辑上讲,我觉得这应该很简单,而不是遍历所有内容并有一个计数变量。<

R 列表 比较

评论


答:

1赞 DaveArmstrong 12/7/2022 #1

这个怎么样:

a <- runif(10000)
b <- runif(10000)
c <- runif(10000)
d <- runif(10000)
mean(a<b & b<c & c<d)
#> [1] 0.0425

reprex 软件包 (v2.0.1) 于 2022-12-06 创建

评论

0赞 Atharva Sunil Sathe 12/7/2022
这按预期工作。我想知道为什么我们不能直接比较这 4 个列表。
1赞 kjetil b halvorsen 12/7/2022 #2

您需要使用逻辑运算符,即 (and) 和 (or)。这两个是并行版本。举个例子:&|

set.seed(7*11*13)  
n <- 100
a <- sample(1:1000, 100)
b <- sample(1:1000, 100)
c <- sample(1:1000, 100)
d <- sample(1:1000, 100)

mean( (a<b)&(b<c)&(c<d) )
1赞 jblood94 12/7/2022 #3

用。Rfast::coldiffs

mean(rowSums(Rfast::coldiffs(matrix(c(A, B, C, D), length(A), 4)) > 0) == 3)
#> [1] 0.0397

或乘法

mean((A<B)*(B<C)*(C<D))

无论出于何种原因,乘法/加法逻辑往往比我遇到的每种情况都快:&|

microbenchmark::microbenchmark(
  coldiffs = mean(rowSums(Rfast::coldiffs(matrix(c(A, B, C, D), length(A), 4)) > 0) == 3),
  logical = mean(A<B & B<C & C<D),
  multiplication = mean((A<B)*(B<C)*(C<D)),
  check = "identical"
)
#> Unit: microseconds
#>            expr     min       lq     mean  median       uq      max neval
#>        coldiffs 253.701 384.6515 454.6581 402.551 429.6010 6795.401   100
#>         logical 131.201 160.5505 200.4389 166.051 173.1515 3510.901   100
#>  multiplication 100.601 122.5010 126.3041 126.001 132.2010  241.400   100

数据

A <- runif(1e4)
B <- runif(1e4)
C <- runif(1e4)
D <- runif(1e4)