在R中逻辑索引和"which"的陷阱

6
有没有在R中使用which进行索引时不能与逻辑索引混合使用的情况?我似乎几个月前遇到了这两个东西的陷阱——当我在其他地方使用逻辑索引删除一些行后,R会维护一些内部行号的概念,这不会与之后使用"which"索引相容。
这是一个已知的现象吗,还是我做了一个梦?

1
为什么要使用 which?很可能你并不需要它。 - hadley
2个回答

11

请注意,NA和其他类似的条目可能会混淆情况。跟随@mdsumner的示例:

> x <- c(1:10,NA,NaN,Inf)
> x > 5
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE    NA    NA
[13]  TRUE
> x[x > 5]
[1]   6   7   8   9  10  NA  NA Inf
> x[which(x > 5)]
[1]   6   7   8   9  10 Inf

不确定这是否就是答案,但确实相当棘手。谢谢! - dwh

6

which函数返回向量中的元素索引号,或者矩阵/数组或数据框中的切片,这些索引号不能与逻辑向量“混合使用”。

考虑在该向量中所有大于5的数字的逻辑向量:

x <- 1:10
x > 5
[1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

这是一个由10个逻辑值组成的向量,但which()等价函数的长度为5:

which(x > 5) [1] 6 7 8 9 10

这些东西不能混合使用并不复杂。第一个隐含地丢弃了前五个元素,并通过数据和逻辑值向量之间的位置匹配仅保留最后五个元素。

x[x > 5]

并且第二种方法显式地仅选择最后五个元素。
x[which(x > 5)]

同样的结果,但是"["操作符的参数在每种情况下都有很大不同。这适用于向量中的单个值或data.frame中的行的情况。


是的,正如你所指出的那样,这并不完全是一个“陷阱”。我意识到了这种差异,而且相当确定这不是让我困惑的原因。 - dwh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接