我创建了一个简单的函数来确定数据框中两个变量之间的区别
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吗?
答案 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)
得到相同的结果。