在找不到搜索项时,在R中使用-which()时出现意外行为

Jef*_*ker 3 r which

我一直在使用R which函数从数据框中删除行.我最近发现,如果搜索词不在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")]
Run Code Online (Sandbox Code Playgroud)

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

42-*_*42- 7

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

 LETTERS[ ! LETTERS == "1" ]
 LETTERS[ ! LETTERS %in% "1" ]
Run Code Online (Sandbox Code Playgroud)

还有另一个需要注意的问题,那就是让我选择使用哪个().使用逻辑索引时,"["内使用的NA值将返回一行.我一般不希望这样,所以我使用DFRM[ which(logical) ]虽然这似乎打扰了一些说不需要的人.我只是认为他们正在使用小型数据集,并且很少遇到在控制台上看到成千上万NA无用的输出线的烦恼.我从来没有使用否定的版本.