2014-04-24 204 views
2

我想返回一列中的值,或NA,取決於其他列中的值。如何在R中正確寫入這個ifelse語句

我基本上是想看看是否在列中的值符合第一個測試標準:

df$v2.1 >= df$varx & df$v3.1 <6 

如果沒有它滿足第二:

df$v4.1 >= df$vary & df$v5.1 >5 

,然後,如果沒有回報NA

我試過的代碼如下。

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 >5 ,df$v1.1, NA) 

回答

1

從我可以告訴df $ v1.1已經定義,所以你只需要修改那些在你的ifelse測試失敗的行。下面可能會更容易:

df$v1.1[ 
    which(
    !(df$v2.1 >= df$varx & df$v3.1 <6) & !(df$v4.1 >= df$vary & df$v5.1 >5)) 
    ] <- NA 
2

你唯一的錯誤是使用||而非|||未被矢量化,只考慮第一個元素。您的所有其他運營商(和ifelse())的矢量化,所以下面應該按預期工作:

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 | df$v4.1 >= df$vary & df$v5.1 > 5, df$v1.1, NA) 

的一個好辦法,當你正在做的相當複雜的或多個邏輯操作的運行逐一檢查和看看你是否獲得了預期的產出。如果你運行:

df$v2.1 >= df$varx & df$v3.1 <6 

df$v4.1 >= df$vary & df$v5.1 > 5 

你應該得到的邏輯值的向量。如果你運行:

df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 > 5 

你應該得到一個邏輯值。在你的情況下,這將得到ifelse()的單一結果,然後再循環填充df$v1.1

+0

謝謝亞歷克斯,這對我以及以下答案。解釋非常感謝。 – Ash