2015-08-08 36 views
1

我有這個數據幀有兩列,其值可以是leftrightR:在兩列上的邏輯運算在兩個列表中都存在NA

test_df <- data.frame(col1 = c("right","left","right",NA), 
         col2 = c("left","right",NA,"right")) 

test_df 

# col1 col2 
# 1 right left 
# 2 left right 
# 3 right <NA> 
# 4 <NA> right 

現在我要測試的這款多重條件

test_df$col1 == "left" | test_df$col2 == "right" 

# [1] FALSE TRUE NA TRUE 

前三個結果如預期,但爲什麼最後的結果是TRUE而不是NA。第3排和第4排的結果有什麼不同?

+0

@RHertel如何讓R在返回之前檢查兩個條件,並在任何一個是NA時返回NA? – CptNemo

+0

爲了使其他讀者的完整性和更好的可見性,我發表了我的評論作爲答案。 – RHertel

回答

1

在您的代碼中,您正在測試是否滿足以下至少一個條件; col1中的「left」或col2中的「right」。在第4行中,col2中有「right」,因此結果爲TRUE,與col1中可能包含或不包含的內容無關。第3行的情況不同。在那裏,col1不包含「左」,因此col2是否包含「右」以便斷定陳述是否爲FALSETRUE仍有待觀察。但是,由於col3中第3行的輸入是NA,因此比較結果無法確定,因此輸出爲NA

如果你想擁有它進行col1和COL2你提到,但返回的條目之間的比較功能NA如果在這兩列條目的任何NA,你可以使用

as.logical((test_df$col1 == "left") + (test_df$col2 == "right")) 
#[1] FALSE TRUE NA NA 

在這行代碼中,單個比較的結果產生TRUEFALSE,被運算符強制爲數值。如果任何部分的金額是NA,總和將是NA。對數據幀的每一行都進行此添加,因此結果是長度爲nrow(test_df)的矢量。

通過使用as.logical(),在括號中計算的總和的結果被轉換回邏輯值。再次,這是爲矢量的每個元素完成的。如果總和爲零,那麼結果是FALSE,如果它是NA它將保持NA。任何非零整數將被轉換爲TRUE