r - 由于 NA 的原因,无法对数据帧进行子集化(过滤)

标签 r data.table dplyr subset

为什么在 dplyr 下面的代码中 filter不返回与基本 R 子集相同的 data.frame?

事实上,它们都没有按预期工作。我想同时删除观察/行b==1 AND c==1 .也就是说,我只想删除第三行。

require(dplyr)
df <- data.frame(a=c(0,0,0,0,1,1,1),
  b=c(0,0,1,1,0,0,1),
  c=c(1,NA,1,NA,1,NA,NA))

filter(df, !(b==1 & c==1))

df[!(df$b==1 & df$c==1),]

最佳答案

或使用 complete.cases转换 NAFALSE在结果逻辑向量中,以便您可以在否定后选择相应的行,这使用了 NA & F = F 的事实:

filter(df, !(b == 1 & c == 1 & complete.cases(df[c('b', 'c')])))

#   a b  c
# 1 0 0  1
# 2 0 0 NA
# 3 0 1 NA
# 4 1 0  1
# 5 1 0 NA
# 6 1 1 NA

更多逻辑操作 NA这里涉及到,乍一看有点令人困惑,但它们遵循以下逻辑:
NA & F
# [1] FALSE
NA | T
# [1] TRUE
NA & T
# [1] NA
NA | F
# [1] NA

关于r - 由于 NA 的原因,无法对数据帧进行子集化(过滤),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948196/

相关文章:

r - 展开 data.table 中的日期

R - 总结相对学期序列的类(class)注册

r - 评估另一个表中是否不存在某个值

R : group by with custom functions

r - 从 R 中的先前观察中查找信息

r - 插入空行以完成列的情况

r - 从数据框中的两个字符类型行的组合创建一个新行

r - 防止 Rstudio 在源面板中显示绘图

r - 如何按包含 dbplyr 中的变量的字符串进行过滤

r - 根据时间间隔合并行值