在R中我如何得到mapply忽略传递给函数

时间:2016-10-02 00:40:14

标签: r mapply

我创建了一个简单的函数来确定数据框中两个变量之间的区别

 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吗?

1 个答案:

答案 0 :(得分: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从case_when包中指出dplyr,您也可以这样做:

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)得到相同的结果。