【问题标题】:Ignore NA values in filtering with dplyr使用 dplyr 过滤时忽略 NA 值
【发布时间】:2019-05-09 14:21:09
【问题描述】:

我有一个数据框,例如:

> 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

我正在尝试保留值 的组

我试过了:

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

我想过滤所有具有

我试过你的回答:

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

【问题讨论】:

  • ^ 不是完全的欺骗
  • 你需要tab%&gt;% group_by(Groups) %&gt;% filter(all(Value &lt; 80 |is.na(Value)), abs(sp - mrca) %in% 0:9)
  • 我不明白为什么Group2 被删除了。您的逻辑表明 sp-mrca 对于这些行也是 TRUE (如果它是 abs 差异)`
  • @akrun 是的,完美,非常感谢:)

标签: r dplyr


【解决方案1】:

我们可以使用 |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 代码中的问题是,当我们用 Value &lt; 80 包装 all 时,比较返回 NA 对于那些为 NA 的值,现在 all 也返回 NA 而不是逻辑TRUE/FALSE 和filter,默认自动删除NA

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

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"))

【讨论】:

  • 您好@akrun,使用此解决方案只有 Group2 通过过滤器,并且只有 Group1 的 NA 值(不是 1、4 和 78)
  • @chippycentra 抱歉,这是| 运算符
  • 如果你有时间看一下,我用另一个类似的案例更新了我的帖子?
【解决方案2】:

我们可以使用来自基础 R 的 avesubset。从数据中删除NA 行并从原始tab 中找到all 值小于80 和subset 的组

subset(tab, Groups %in% unique(with(na.omit(tab), 
            Groups[ave(Value < 80, Groups, FUN = all)])))

#  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

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2018-02-03
    • 1970-01-01
    • 2017-01-08
    • 2020-08-11
    相关资源
    最近更新 更多