R语言中data$group == c("A","B")与或逻辑筛选的差异是什么?
R两种数据筛选写法结果差异的核心原因
这个差异是R的向量化运算规则直接导致的:
- R的比较运算符
==是向量化运算,会触发循环补齐机制:当运算符左右两侧的向量长度不一致时,短向量会被自动重复拼接,直到和长向量长度相同,再逐位进行比较。
第一种写法错误原因
你使用的data$group == c("A","B")逻辑如下:
data$group是长度为32的向量,右侧c("A","B")是长度为2的向量,会被循环补全为c("A","B","A","B",...)(重复16次,总长度32)- 补全后逐位对比:第1行group和"A"比、第2行和"B"比、第3行和"A"比、第4行和"B"比,以此类推
- 只有对应位置的元素完全相等才会返回
TRUE,所以只能匹配到刚好符合位置规律的行,无法筛选出所有值为"A"或"B"的记录,最终得到的行数自然小于32。
第二种写法正确原因
data$group == "A" | data$group == "B"的逻辑是对每一行单独做两次判断:先判断当前行group值是否等于"A",再判断是否等于"B",只要满足其中一个条件就返回TRUE,所以所有符合要求的32条记录都会被筛选出来。
多值匹配的简化正确写法
如果不想写多个|判断,可以用%in%运算符,作用是判断左侧向量的每个元素是否属于右侧集合,和第二种写法的逻辑完全等价:
d3 <- subset(data, group %in% c("A","B"))
内容的提问来源于stack exchange,提问作者IdkIDK
相关产品推荐
相关产品推荐

