【问题标题】:Filtering rule application when multiple categories exist in RR中存在多个类别时的过滤规则应用
【发布时间】:2022-09-27 22:50:09
【问题描述】:

我有一个过滤问题如下:

df <- data.frame(id = c(1,1,1, 2,2, 3,3, 4,4, 5, 6),
                 cat =c(\"A\",\"B\",\"C\", \"A\",\"C\", \"B\",\"C\", \"A\",\"B\", \"A\", \"B\"),
                 value = c(\"Y\",\"N\",\"Y\", \"Y\",\"N\", \"N\",\"Y\", \"N\",\"Y\", \"N\",\"Y\"))

> df
   id cat value
1   1   A     Y
2   1   B     N
3   1   C     Y
4   2   A     Y
5   2   C     N
6   3   B     N
7   3   C     Y
8   4   A     N
9   4   B     Y
10  5   A     N
11  6   B     Y

过滤规则:

1)id 有三个cat 时,我只需要保留cat B

2)id 有两个cat - AB 时,我只需要保留cat B

3)id 有两个cat - AC 时,我只需要保留cat C

4)id 有两个cat - BC 时,我只需要保留cat B

5)id 有一个cat - 保留类别。

总之,所需的cat 顺序是第一个B,然后是C,最后一个A(如果只有一个类别)。

我怎样才能实现这个所需的数据框:

> df1
  id cat value
1  1   B     N
2  2   C     N
3  3   B     N
4  4   B     Y
5  5   A     N
6  6   B     Y

它在下面尝试了这个,但它只考虑cat B 过滤。当cats 是AC 时,我还需要添加C 过滤。

df %>% group_by(id) %>% mutate(value = value[match(\"B\", cat, nomatch = 1)]) %>% ungroup
  • 你试过什么?什么不工作?将一堆过滤条件加在一起,这似乎是可行的

标签: r filter


【解决方案1】:

这是使用一些合适的case_when 条件的选项:

df %>%
    group_by(id) %>%
    filter(case_when(
        length(cat) == 3 & all(cat %in% c("A", "B", "C")) ~ cat == "B",
        length(cat) == 2 & all(cat %in% c("A", "B")) ~ cat == "B",
        length(cat) == 2 & all(cat %in% c("A", "C")) ~ cat == "C",
        length(cat) == 2 & all(cat %in% c("B", "C")) ~ cat == "B",
        length(cat) == 1 ~ cat == unique(cat))) %>%
    ungroup()
## A tibble: 6 × 3
#     id cat   value
#  <dbl> <chr> <chr>
#1     1 B     N    
#2     2 C     N    
#3     3 B     N    
#4     4 B     Y    
#5     5 A     N    
#6     6 B     Y    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多