2016-10-02 33 views
0

我創建了一個簡單的函數來確定在數據幀2級的變量之間的差R中如何獲得mapply忽略NA傳遞給

detYearDisc <- function(x,y) 
{ 
    if (x < y) 
      return("L") 
    if (x > y) 
      return("G") 
    if (x == y) 
      return("N") 

} 

的數據幀DF可以包含上×NA的功能元件或y或兩者。當我運行mapply功能

df$DiscInd = mapply(detYearDisc, df$X,df$Y) 

我得到以下錯誤:

Error in if (x < y) return("L") : missing value where TRUE/FALSE needed 

這是因爲我得到了NA的X或Y值?

+1

爲什麼'mapply()'?爲什麼不是嵌套和向量化的'ifelse()'? – Parfait

+0

@Parfait,我試過了,我得不到任何地方,所以我決定切換執行 –

+1

'dplyr :: case_when'很好。 – alistaire

回答

2

是的,原因是他們中的任何一個都有NA的價值。請參閱以下內容:

mapply(detYearDisc, 1,2) 
#[1] "L" 
mapply(detYearDisc, 2,2) 
#[1] "N" 
mapply(detYearDisc, 2,1) 
#[1] "G" 
mapply(detYearDisc, 2,NA) 
#Error in if (x < y) return("L") : missing value where TRUE/FALSE needed 

來處理它,你可以添加以下內容作爲你的函數的第一行:

if (is.na(x) | is.na(y)) 
    return("Not a number!") 

然而,就可以實現這個簡單的ifelse相同的量化方式:

ifelse(df$x>df$y, "G", ifelse(df$x<df$y, "L", "N")) 

NA情況下,它會返回NA。例如。爲:

df 
    x y 
1 1 5 
2 3 0 
3 5 1 
4 NA 4 

會給你:

[1] "L" "G" "G" NA 

另外,由於@alistaire從dplyr包指出case_when,你也可以這樣做:

f <- function(x,y){ 
case_when(
    (is.na(x) | is.na(y)) ~ "NA", 
    x>y ~ "G", 
    x<y ~ "L", 
    TRUE ~ "N" 
)} 

所以,你將通過調用函數f(df$x, df$y)獲得相同的結果。

+0

@ moh3n如果我使用ifelse,它是否能夠處理NA事件? –

+0

@EB是的,在這種情況下,它會返回「NA」。 – 989

+0

所以我只是用dfly實現使用函數:df $ DiscInd = f(df $ X,df $ Y))... –