2013-04-16 13 views
3

我一直在使用R which函數刪除數據框中的行。我最近發現如果搜索項不在data.frame中,結果是一個空字符。當搜索項未找到時,在R中使用-which()會出現意外的行爲

# 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

正因爲如此:

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

和此:

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

代替#4,使用:

LETTERS[LETTERS != "R"] 
3

在實施例2,which返回integer(0)(零因爲沒有值是TRUE。負零長度向量(-integer(0))仍然是零長度向量。所以你基本上要求LETTERS的元素NULL,它不存在。

7

這是一個衆所周知的陷阱。當沒有任何符合邏輯測試時,哪個函數返回數字(0),然後「[」不返回任何內容,而是返回所期望的所有內容。您可以使用:

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

還有另一個需要注意的問題,是讓我選擇使用哪個()。當使用邏輯索引時,在「[」中使用的NA值將返回一行。我通常不希望這樣,所以我使用DFRM[ which(logical) ],雖然這似乎打擾了一些說不需要的人。我只是認爲他們正在處理小數據集,並且很少遇到在他們的控制檯上看到數以萬計的由NA引起的無用輸出線的煩惱。我從來沒有使用否定哪個版本。

相關問題