【发布时间】:2018-03-09 18:14:20
【问题描述】:
我有一个关于 dplyr 的 filter() 函数和/或 R 中的 base subset() 函数的问题。基本上,当我使用 filter() 或 subset() 时,我可以根据两个条件提取观察结果,这就是我需要的。 例如,这是我迄今为止一直在使用的:
df %>% filter(Axis_1_1 == "Diagnostic of function on axis1 postponed") %>% filter(is.na(diagnostic_code9))
这为我提供了同时满足这两个条件的适量观察,即总共 23992 个中的 92 个。
但是,当我使用否定符号不将这些观察结果包含在当前数据框中时,R 将删除大约 8000 个额外的观察结果。因此,最终结果是在用否定“!”过滤后剩下 15992 个观察值。使用的标志。示例:
df %>% filter(Axis_1_1 != "Diagnostic of function on axis1 postponed") %>% filter(!is.na(diagnostic_code9))
使用基于 R 的简单子集给我同样错误的最终结果,但它设法找到满足条件的正确 92 个观察值,如第一个示例中所述。
subset(df, df$Axis1_1 == "Diagnostic of function on axis1 postponed" & is.na(diagnostic_code9))
我的数据框在当前设置中包含 112 个变量和 23900 多个观察值。
因此,我的问题是:
- 我正在使用的数据框会不会有什么奇怪的地方(很遗憾,我不能给你一个子集)
- 第二,我的编码有问题吗?
- 最后,R 在后台到底在做什么?因为它能够根据与字符串和 is.na() 函数匹配的确切条件过滤掉这些观察结果,同时在使用否定符号时完全做其他事情。
【问题讨论】:
-
在逻辑上,你第一次是在做
A AND B,第二次是(not A) AND (not B)。但not(A AND B)实际上是(not A) OR (not B)。见deMorgan's Laws on wikipedia。 -
那么你第二次想要得到补码的是
filter(Axis_1_1 != "Diagnostic of function on axis1 postponed" | !is.na(diagnostic_code9))。 -
或者,如果你第一次使用单个
filter和filter(A & B),你可以用括号filter(!(A & B))否定它