3

我一直在使用 Rwhich函数从数据框中删除行。我最近发现如果搜索词不在 data.frame 中,结果是一个空字符。

# 1: returns A-Q, S-Z (as expected)
LETTERS[-which(LETTERS == "R")]
# 2: returns "character(0)" (not what I would expect)
LETTERS[-which(LETTERS == "1")]
# 3: returns A-Z (expected)
LETTERS[which(LETTERS != "1")]
# 4: returns A-Q, S-Z (expected)
LETTERS[which(LETTERS != "R")]

第二个示例-which()是未找到搜索词时的预期行为吗?我已经将我的代码切换为使用示例 4 中的语法,这似乎更安全,但我只是好奇。

4

3 回答 3

7

这是一个众所周知的陷阱。当没有与逻辑测试匹配时,which-function 返回 numeric(0),然后 "[" 不返回任何内容,而不是返回预期的所有内容。您可以使用:

 LETTERS[ ! LETTERS == "1" ]
 LETTERS[ ! LETTERS %in% "1" ]

还有另一个需要注意的问题,也是让我选择使用 which() 的问题。当使用逻辑索引时,“[”中使用的 NA 值将返回一行。我通常不希望这样,所以我使用DFRM[ which(logical) ]虽然这似乎打扰了一些说不需要的人。我只是认为他们正在处理小型数据集,并且很少遇到在他们的控制台上看到数以万计的 NA 引起的无用输出行的烦恼。我从不使用否定的哪个版本。

于 2013-04-16T22:03:41.937 回答
4

因为这:

which(LETTERS == '-1')
## integer(0)

和这个:

(1:2)[integer(0)]
integer(0)

而不是#4,使用这个:

LETTERS[LETTERS != "R"]
于 2013-04-16T22:02:28.493 回答
3

在示例 2 中,which返回integer(0)(长度为零的整数向量),因为没有值是TRUE. 负零长度向量 ( -integer(0)) 仍然是零长度向量。所以你本质上是在要求不存在的NULL元素。LETTERS

于 2013-04-16T22:02:49.733 回答