提问人:Atharva Sunil Sathe 提问时间:12/7/2022 更新时间:12/7/2022 访问量:49
R 中两个以上列表的比较
Comparisons of more than two lists in R
问:
对于我的问题,我有 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 的绝对初学者,但从逻辑上讲,我觉得这应该很简单,而不是遍历所有内容并有一个计数变量。<
答:
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)
评论