我有两个向量:
a <- c(1,1,2,3,4,4,4,4,5,6)
b <- c(T,F,T,F,T,T,F,F,F,T)
我想有一个向量告诉我 b
中 a
中每个唯一值有多少TRUE . (第二栏)
[,1] [,2]
[1,] 1 1
[2,] 2 1
[3,] 3 0
[4,] 4 2
[5,] 5 0
[6,] 6 1
我能来到这里的最好的就是使用sapply:
sapply(unique(a), FUN = function(uniqueA, a, b) sum(b[a == uniqueA]), a = a, b = b)
这很好,但对于较大的向量,它相当慢 . (我尝试了一些子集变体 . )
a <- sample(1:1000, 1e5, replace = TRUE)
b <- sample(c(T,F), 1e5, replace = TRUE)
microbenchmark::microbenchmark(
subset = sapply(unique(a), FUN = function(uniqueA, a, b) sum(b[a == uniqueA]), a = a, b = b)
, iN = sapply(unique(a), FUN = function(uniqueA, a, b) sum(a %in% uniqueA & b), a = a, b = b)
, equal = sapply(unique(a), FUN = function(uniqueA, a, b) sum(a == uniqueA & b), a = a, b = b)
, times = 5
)
Unit: milliseconds
expr min lq mean median uq max neval
subset 389.1995 390.6002 413.6969 393.0396 445.6553 449.9897 5
iN 2746.8407 2798.0462 2797.3155 2806.9477 2814.6317 2820.1110 5
equal 1080.3430 1089.2507 1111.0267 1096.8082 1135.1957 1153.5358 5
有没有人知道如何更快地做到这一点?
3 回答
你可以使用
aggregate
:为了获得最快的性能,我建议使用
data.table
. 设置需要更长时间,但对于大量数据,性能应该非常好 .速度测试比较(1)聚合,(2)sapply,(3)data.table,(4)tapply:
看起来
data.table
是最快的这个可能在基数R中使用
table
:如果你想要那些数字为非零的
TRUE
,那么只需_2847614就足够了 .或者我们可以使用
tidyverse
基本R选项将是