我试图从包含缺失观察的数据框中子集行。我可以选择满足特定条件的行。但是,在使用!
. 最终,我能够通过使用排除不符合所需条件的行-
。
有没有办法用 排除所需的行!
?
这是一个示例数据集:
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
语句来选择不符合所需条件的行。但是,我想知道如何使用!
.