使用 dplyr 过滤时忽略 NA 值

Chippycentra

我有一个数据框,例如:

> tab
   Groups Species Value
1  Group1     Sp1     1
2  Group1     Sp1     4
3  Group1     Sp2    78
4  Group1     Sp3    NA
5  Group1     Sp4    NA
6  Group2     Sp2     3
7  Group2     Sp3     9
8  Group2     Sp4     8
9  Group3     Sp1     9
10 Group3     Sp3    10
11 Group3     Sp3   110
12 Group3     Sp3    14

我试图保留值 < 80 的组

我试过了:

tab %>%
  group_by(Groups) %>%
    filter(all(Value < 80))

但我不知道如何NA values在过滤器中忽略

在这里我应该得到:

> tab
   Groups Species Value
1  Group1     Sp1     1
2  Group1     Sp1     4
3  Group1     Sp2    78
4  Group1     Sp3    NA
5  Group1     Sp4    NA
6  Group2     Sp2     3
7  Group2     Sp3     9
8  Group2     Sp4     8

有没有人有解决方案?谢谢

如果我也有:

> tab
   Groups Species Value sp mrca
1  Group1     Sp1     1  3    3
2  Group1     Sp1     4  3    3
3  Group1     Sp2    78 NA   NA
4  Group1     Sp3    NA  3   12
5  Group1     Sp4    NA  3    3
6  Group2     Sp2     3  2    3
7  Group2     Sp3     9  2    40
8  Group2     Sp4     8 NA   NA
9  Group3     Sp1     9  2    2
10 Group3     Sp3    10  3    3
11 Group3     Sp3   110  3    2
12 Group3     Sp3    14  2    3

我想过滤所有具有 < 80 个值且 sp - mrca = 0:9 的组

我试过机智你的回答:

tab %>%
  group_by(Groups) %>%
  filter(all(Value < 80 |is.na(Value))) %>%
  filter((all(abs(sp - mrca) %in% 0:9)|is.na(sp) & is.na(mrca)))

但它似乎不是正确的代码

我应该得到:

> tab
   Groups Species Value sp mrca
1  Group1     Sp1     1  3    3
2  Group1     Sp1     4  3    3
3  Group1     Sp2    78 NA   NA
4  Group1     Sp3    NA  3   12
5  Group1     Sp4    NA  3    3
阿克伦

我们可以使用并|is.na

tab %>%
    group_by(Groups) %>%
    filter(all(Value < 80 |is.na(Value)))
# A tibble: 8 x 3
# Groups:   Groups [2]
#  Groups Species Value
#  <chr>  <chr>   <int>
#1 Group1 Sp1         1
#2 Group1 Sp1         4
#3 Group1 Sp2        78
#4 Group1 Sp3        NA
#5 Group1 Sp4        NA
#6 Group2 Sp2         3
#7 Group2 Sp3         9
#8 Group2 Sp4         8

OP 代码中的问题是,当我们用 包装allValue < 80,比较返回NA那些值,NA现在all也返回NA而不是逻辑 TRUE/FALSE 并且在 中filterNA默认情况下它会自动删除

为了更好地理解,请检查输出

tab %>% 
    group_by(Groups) %>% 
    mutate(ind = all(Value < 80))

和这里的区别

tab %>% 
    group_by(Groups) %>% 
    mutate(ind = all(Value < 80| is.na(Value)))

或使用 data.table

library(data.table)
setDT(tab)[, .SD[all(Value < 80 | is.na(Value))], Groups]

或使用 base R

tab[with(tab, ave(Value < 80  | is.na(Value), Groups, FUN = all)),]

更新

对于第二个数据集,

tab1 %>% 
    group_by(Groups) %>%
    filter(all(Value < 80 |is.na(Value)),
           all(na.omit(abs(sp-mrca)) %in% 0:9))

数据

tab <- structure(list(Groups = c("Group1", "Group1", "Group1", "Group1", 
"Group1", "Group2", "Group2", "Group2", "Group3", "Group3", "Group3", 
"Group3"), Species = c("Sp1", "Sp1", "Sp2", "Sp3", "Sp4", "Sp2", 
"Sp3", "Sp4", "Sp1", "Sp3", "Sp3", "Sp3"), Value = c(1L, 4L, 
78L, NA, NA, 3L, 9L, 8L, 9L, 10L, 110L, 14L)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))



tab1 <- structure(list(Groups = c("Group1", "Group1", "Group1", "Group1", 
"Group1", "Group2", "Group2", "Group2", "Group3", "Group3", "Group3", 
"Group3"), Species = c("Sp1", "Sp1", "Sp2", "Sp3", "Sp4", "Sp2", 
"Sp3", "Sp4", "Sp1", "Sp3", "Sp3", "Sp3"), Value = c(1L, 4L, 
78L, NA, NA, 3L, 9L, 8L, 9L, 10L, 110L, 14L), sp = c(3L, 3L, 
NA, 3L, 3L, 2L, 2L, NA, 2L, 3L, 3L, 2L), mrca = c(3L, 3L, NA, 
12L, 3L, 3L, 40L, NA, 2L, 3L, 2L, 3L)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用dplyr汇总时忽略NA

来自分类Dev

首先和最后使用dplyr,但忽略NA值

来自分类Dev

使用dplyr对多列求和时忽略NA

来自分类Dev

使用dplyr :: filter()删除NA观察值

来自分类Dev

使用dplyr将某些值设置为NA

来自分类Dev

使用dplyr将多个值设置为NA

来自分类Dev

如何使用dplyr计算总的非na值?

来自分类Dev

dplyr mutate()从数据帧匹配时显示NA值

来自分类Dev

dplyr值摘要返回NA

来自分类Dev

dplyr join定义NA值

来自分类Dev

使用dplyr过滤最大值之前的所有值

来自分类Dev

r:使用pmax函数忽略NA值

来自分类Dev

如何在整个列中使用dplyr来过滤NA

来自分类Dev

如何在整个列中使用dplyr来过滤NA

来自分类Dev

dplyr过滤器在未指定NA时删除NA

来自分类Dev

使用dplyr过滤PostgreSQL数据库中的多个值

来自分类Dev

使用向量而不是单个值来过滤{dplyr}

来自分类Dev

使用动态列名和动态值的 Dplyr 过滤器

来自分类Dev

R,dplyr的子集数据帧过滤列A的行值而不是列B的行NA

来自分类Dev

缺少值时使用rollmean(NA)

来自分类Dev

dplyr 中的 Sum() 和聚合:NA 值

来自分类Dev

使用均值时忽略值

来自分类Dev

使用dplyr r更改列中的值时提取行

来自分类Dev

使用 NSE 时出错(在 dplyr 中):找不到对象“值”

来自分类Dev

忽略dplyr行总和中的NA

来自分类Dev

使用dplyr获取列的值

来自分类Dev

使用dplyr返回匹配的值

来自分类Dev

使用dplyr过滤相对于另一列中的值的值

来自分类Dev

在一列中使用逻辑+ NA值进行过滤