0

我试图从包含缺失观察的数据框中子集行。我可以选择满足特定条件的行。但是,在使用!. 最终,我能够通过使用排除不符合所需条件的行-

有没有办法用 排除所需的行!

这是一个示例数据集:

df = read.table(text = "
     state  county    var1.a  var2.a  var1.b  var2.b
        1       1       10       25      20      25
        1       2       20       15      20      15
        2       1       30       NA      40      25
        2       2       40       35      10      35
        3       1       20       45      10      NA
        3       2       20       55      20      55
        4       1       NA       65      NA      NA
        4       2       80       NA      30      NA
        5       1       NA       15      NA      15
        5       2       NA       15      NA      35
", na.strings = "NA", header = TRUE)

# 1. works, selects Rows 2, 6 and 9, rows in which columns 3 and 5 are the same and
# columns 4 and 6 are the same

df[ (which( ( ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b))) & 
              ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b))) ) , arr.ind=TRUE)),]

# 2. does not work when excluding Rows 2, 6 and 9, does not retain Row 7

df[ (which(!( ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b))) & 
              ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b))) ) , arr.ind=TRUE)),]

# 3. does not work, does not select any rows

df[!(which( ( ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b))) & 
              ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b))) ) , arr.ind=TRUE)),]

# 4. works, selects Rows 1,3,4,5,7,8,10

df[-(which( ( ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b))) & 
              ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b))) ) , arr.ind=TRUE)),]

上面的第二个which语句没有选择第 7 行,因为:

( ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b))) & 
  ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b))) )

返回:

# [1] FALSE  TRUE FALSE FALSE FALSE  TRUE    NA FALSE  TRUE FALSE

所以,我想我明白为什么!在这种情况下不起作用;但我不知道如何获得:

# [1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE

除了第 1、3、4、5、8、10 行之外,我如何修改第二which条语句以还返回第 7 行?which如果没有缺失的观察结果 ,第二个语句确实有效。

即使没有缺失的观察,第三个which语句也不起作用。我知道那-是用来删除行或列的。我知道这!是为了逻辑比较。我猜第三个which语句不符合逻辑比较的要求,但第二个which语句可以。

我想我可以使用第一which条语句来选择符合所需条件的行,并使用第四条which语句来选择不符合所需条件的行。但是,我想知道如何使用!.

4

2 回答 2

2

你错过了一个是NA而另一个不是的情况;应该是FALSE这样,因为它不匹配,但你得到一个NA. 由于这是您获得 的唯一情况NA,因此我们可以事后检查。这是一种方法:

> ok1 <- ((df$var1.a == df$var1.b) | (is.na(df$var1.a) & is.na(df$var1.b)))
> ok2 <- ((df$var2.a == df$var2.b) | (is.na(df$var2.a) & is.na(df$var2.b)))
> ok.both <- ok1 & !is.na(ok1) & ok2 & !is.na(ok2)
> ok.both
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE

此外,创建一个新函数来执行此操作可能很有用,如下所示:

eqna <- function(a, b) {
  ok <- ((a == b) | (is.na(a) & is.na(b)))
  ok & !is.na(ok)
}

你会这样使用它:

> with(df, eqna(var1.a, var1.b) & eqna(var2.a, var2.b))
 [1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
于 2013-02-22T21:57:42.797 回答
0

我在这里可能是错的(用我的手机写的)但看起来#2 不起作用的原因只是由于括号。

!只是否定你的条款的前半部分。尝试在逗号之后添加另一组括号!并在逗号之前将其关闭。

另外,请记住,这!只是反转逻辑值。即它交换 T/F,同时将 NA 保留为 NA。

于 2013-02-23T05:25:32.993 回答