在 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)
.
会得到相同的结果
我创建了一个简单的函数来确定数据框中 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)
.