2017-09-03 96 views
0

目標:使用ifelse語句在下面評估兩個單獨的列,即var1和var2,以在下面創建第三個組合列var3。例如,我想檢查每一列,如果它們都包含NA,則在第三列var3中需要NA。如果var1或var2包含-1,0或1,我希望它位於var3中在創建新列時如何在ifelse中處理NA

問題:打開所有的NAs。我知道評估新手存在一些愚蠢的問題,但我很想念它。

所需的輸出:

var1 var2 var3 
    1 NA 1 
    NA 1  1 
    NA NA NA 
    NA -1 -1 
    0 NA 0 

重複的例子:

library(tidyverse) 

df <- data.frame(var1 = c(1, 1, NA, NA, 0), 
        var2 = c(NA, 1, NA, -1, NA)) 

df_addvar3 <- df %>% 
    mutate(var3 = ifelse(var1 == NA | var2 == NA, NA, 
         ifelse(var1 == -1 | var2 == -1, -1, 
          ifelse(var1 == 0 | var2 == 0, 0, 
           ifelse(var1 == 1 | var2 == 1, 1, NA))))) 

df_addvar3 
+1

考慮到你的例子,你並不需要'ifelse'語句,你可以做'mutate(var3 = pmax(var1,var2,na.rm = T))'或'mutate(var3 = coalesce(var1 ,VAR2))'。 – Lamia

回答

2

只是爲了解釋爲什麼您的版本不起作用:NA == NA沒有TRUE,這是NA - 概念這是有道理的,通常我們想知道兩個值是否相同,如果我們不知道它們中的一個或兩個,我們不知道它們是否相同。要測試一個值是否爲NA,您需要使用功能is.NA()。這裏有一個簡單的版本:

df_addvar3 <- df %>% 
    mutate(var3 = ifelse(is.na(var1), var2, var1)) 

你的問題不是很清楚要發生什麼,如果該值是-1是不同的:1,或者如果VAR1和VAR2都沒有NA,但彼此不同。如有必要,所有這些應該相對簡單。

0
replace(x = df[cbind(1:NROW(df), max.col(replace(df, is.na(df), -Inf)))], 
     list = rowSums(is.na(df)) == NCOL(df), 
     values = NA) 
#[1] 1 1 NA -1 0