我有两个向量:
a <- letters[1:5]
b <- c('a','k','w','p','b','b')
现在我想计算向量a
中的每个字母在b
中显示的次数。我想得到:
# 1 2 0 0 0
我该怎么办?
答案 0 :(得分:5)
tabulate
适用于整数向量并且速度很快;将您的字母与可能的字母的世界相匹配,然后将索引制成表格;使用length(a)
确保每个可能值都有一个计数。
> tabulate(match(b, a), length(a))
[1] 1 2 0 0 0
这比'明显'的table()解决方案
更快library(microbenchmark)
f0 = function() table(factor(b,levels=a))
f1 = function() tabulate(match(b, a), length(a))
然后
> microbenchmark(f0(), f1())
Unit: microseconds
expr min lq median uq max neval
f0() 566.824 576.2985 582.950 594.4200 798.275 100
f1() 56.816 60.0180 63.305 65.4185 120.441 100
但也更通用,例如,matching numeric values而不强制转换为字符串表示。
答案 1 :(得分:4)
将b
变为具有a
指定级别的因子。不在a
中的值将变为<NA>
。制表时,它们将被丢弃(除非您指定useNA="ifany"
)。
table(factor(b,levels=a))
a b c d e
1 2 0 0 0
答案 2 :(得分:2)
>sapply(a, function(x) sum(x==b))
a b c d e
1 2 0 0 0
替代解决方案。可以修改匿名函数以实现与诸如stringdist