R中同尺寸df与逻辑数据框执行df[logicaldf,]的作用是什么?
R数据框
df[逻辑矩阵, ]的运行逻辑解释 两种索引规则的差异
你之前熟悉的df[x, ]属于行筛选索引,要求x是长度和数据框行数相等的向量:
- 若为逻辑向量:保留
x为TRUE对应的行 - 若为数值向量:保留对应行号的行
但你本次传入的foo5是和foo完全同维度(5行3列)的逻辑矩阵,不是等长行向量,因此触发了R的矩阵元素索引规则,整个执行过程可以拆为三步:
- R会先把逻辑矩阵
foo5按列优先顺序拉平为一维向量,提取所有TRUE位置对应的原数据框元素,单独执行foo[foo5](不加逗号)你会得到如下输出:
[1] 11 53 9 10
这就是foo中所有大于5的元素值。
2. 你写的foo[foo5, ]相当于把上面提取到的4个元素c(11,53,9,10)当成了行号向量,去取foo的对应行。
3. 你的foo总共只有5行,行号11、9、10都超出了最大行号范围,R会用NA填充这些不存在的行,最终就得到了你看到的2行有效数据+2行NA的结果。
正确筛选行的写法
如果你需要筛选至少有一个元素大于5的行,应该先生成和行数等长的逻辑向量,而非全表逻辑矩阵,参考写法:
# 方法1:通过rowSums判断每行是否存在大于5的元素 foo[rowSums(foo > 5) > 0, ] # 方法2:通过apply逐行判断是否有满足条件的元素 foo[apply(foo > 5, 1, any), ]
两种写法都会返回预期的筛选结果:
c1 c2 c3 1 11 9 1 2 2 3 10 5 53 2 2
内容的提问来源于stack exchange,提问作者aj207
相关产品推荐
相关产品推荐

