在 R 中,我如何让 mapply 忽略传递给函数的元素上的 NA

in R how do i get mapply to ignore the NA on elements passed to the function

我创建了一个简单的函数来确定数据框中 2 个变量之间的差异

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

}

数据帧 df 可以在 x 或 y 或两者上包含 NA。当我 运行 mapply 函数

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

我收到以下错误:

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

这是因为我在 x 或 y 值上得到了 NA 吗??

是的,原因是它们中的任何一个都具有 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 的情况下,它将 return 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).

会得到相同的结果