我一直在使用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中的语法,这似乎更安全,但我只是好奇.
这是一个众所周知的陷阱.当没有任何东西与逻辑测试匹配时,which-function返回numeric(0),然后"["不返回任何内容,而是返回预期的所有内容.您可以使用:
LETTERS[ ! LETTERS == "1" ]
LETTERS[ ! LETTERS %in% "1" ]
Run Code Online (Sandbox Code Playgroud)
还有另一个需要注意的问题,那就是让我选择使用哪个().使用逻辑索引时,"["内使用的NA值将返回一行.我一般不希望这样,所以我使用DFRM[ which(logical) ]虽然这似乎打扰了一些说不需要的人.我只是认为他们正在使用小型数据集,并且很少遇到在控制台上看到成千上万NA无用的输出线的烦恼.我从来没有使用否定的版本.