R语言prob包subset向量筛选结果差异及异常原因咨询
核心问题是你混淆了R中==和%in%运算符的作用,同时触发了R的向量循环匹配规则:
- R中用
==比较两个长度不等的向量时,会自动把短向量重复循环到和长向量长度一致后逐位比较,并非你预期的「判断左侧元素是否属于右侧的向量集合」。
你用rolldie(1, makespace=TRUE)生成的样本空间S共6行,X1列的值依次为1,2,3,4,5,6,每行对应概率均为1/6,我们基于这个基础逐组解释你的测试结果:
子集A/重复测试的E(X1 == c(2,4,6))
右侧向量长度为3,会循环2次变成c(2,4,6,2,4,6),和X1逐位比较:
12?否 | 24?否 | 36?否 | 42?否 |54?否 |66?是
仅最后1行符合条件,子集概率为1/6≈0.1666667,和运行结果一致。
子集C(X1 == c(2,4))
右侧向量长度为2,循环3次变成c(2,4,2,4,2,4),和X1逐位比较:
12?否 |24?否 |32?否 |44?是 |52?否 |64?否
仅X1=4的行符合条件,子集概率为1/6≈0.1666667,和运行结果一致。
子集D(X1 == c(1,2))
右侧向量循环3次变成c(1,2,1,2,1,2),和X1逐位比较:
11?是 |22?是 |31?否 |42?否 |51?否 |62?否
共2行符合条件,子集概率为2/6≈0.3333333,和运行结果一致。
子集B(X1 == c(3,6))
右侧向量循环3次变成c(3,6,3,6,3,6),和X1逐位比较:
13?否 |26?否 |33?是 |46?否 |53?否 |66?是
共2行符合条件,子集概率为2/6≈0.3333333,和运行结果一致。
子集E(X1 == c(4,5,6))
右侧向量循环2次变成c(4,5,6,4,5,6),和X1逐位比较:
14?否 |25?否 |36?否 |44?是 |55?是 |66?是
共3行符合条件,子集概率为3/6=0.5,和运行结果一致。
如果要筛选X1属于指定集合的行,需要用%in%运算符替换==,比如筛选偶数点数的正确代码为:
A = subset(S, X1 %in% c(2,4,6)) Prob(A) # 输出为0.5,符合你的预期
内容的提问来源于stack exchange,提问作者hyunjoo seong

