R 考虑NA在子集中是否相等?

R 考虑NA在子集中是否相等?,r,subset,R,Subset,我发现,当我对数据集进行子集设置时,我必须始终如一地使用相同的模式,我希望能够简化这一点: subset(test, (X1 == 2 | is.na(X1)) & (X2 > 4 | is.na(X2)) ) 本质上,我需要考虑列中的NA也与子集条件中的条件匹配。我正在寻找一个函数,它将产生与上述相同的结果,但理想情况下,只需要质量条件并生成NA条件(或者可能是模式?) 一些示例数据: test = structure(list(X1 = c(3L, NA, 7L, NA, 2

我发现,当我对数据集进行子集设置时,我必须始终如一地使用相同的模式,我希望能够简化这一点:

subset(test, (X1 == 2 | is.na(X1)) & (X2 > 4 | is.na(X2)) )
本质上,我需要考虑列中的NA也与子集条件中的条件匹配。我正在寻找一个函数,它将产生与上述相同的结果,但理想情况下,只需要质量条件并生成NA条件(或者可能是模式?)

一些示例数据:

test = structure(list(X1 = c(3L, NA, 7L, NA, 2L, 6L, 4L, 9L, 4L, 5L), 
    X2 = c(0L, 4L, 5L, 5L, NA, 5L, 8L, 7L, 2L, NA)), .Names = c("X1", 
"X2"), row.names = c(NA, -10L), class = "data.frame")
一个示例查询:

> subset(test, (X1 == 2 | is.na(X1)) & (X2 > 4 | is.na(X2)) )
  X1 X2
4 NA  5
5  2 NA
不完美,但:

data <- data.frame(V1=1:10, V2=c(1:5, NA, 1:4))
subset(data, V1 == 1 &  V2 == 1 | is.na(V1 + V2)) 

您可能想对其进行更多的测试,但至少在测试中,您会证明这是可行的。此处的
subsetNA
subset.data.frame
相同,但标记为##的一行除外:


我们能看到一些数据吗?应该是&,而不是&。@RichardScriven刚刚添加:)@G.Grothendieck Fixed。谢谢从注释而不是实际查询中键入!:)现在我又糊涂了。测试数据不包含任何10秒或11秒。。。也许真的能做到。需要更多的思考;我不知道你可以组合像那样的
is.na
参数!您只是将一个向量传递给
is.na
。函数式编程。看起来这是不可能的。
is.na
并没有像我期望的那样通过表达式分发(在测试数据上获得4个结果)。现在问题更清楚了。我从来没有想过只看一下
子集。我已经试过了,但似乎答案完全正确。
data <- data.frame(V1=1:10, V2=c(1:5, NA, 1:4))
subset(data, V1 == 1 &  V2 == 1 | is.na(V1 + V2)) 
  V1 V2
1  1  1
6  6 NA
subsetNA <- 
function (x, subset, select, drop = FALSE, ...) 
{
    r <- if (missing(subset)) 
        rep_len(TRUE, nrow(x))
    else {
        e <- substitute(subset)
        r <- eval(e, x, parent.frame())
        if (!is.logical(r)) 
            stop("'subset' must be logical")
        r | is.na(r) ##
    }
    vars <- if (missing(select)) 
        TRUE
    else {
        nl <- as.list(seq_along(x))
        names(nl) <- names(x)
        eval(substitute(select), nl, parent.frame())
    }
    x[r, vars, drop = drop]
}
> subset(test, (X1 == 2 | is.na(X1)) & (X2 > 4 | is.na(X2)) )
  X1 X2
4 NA  5
5  2 NA
> subsetNA(test, X1 == 2 & X2 > 4)
  X1 X2
4 NA  5
5  2 NA