【问题标题】:R: How to filter with two conditions of One column?R:如何过滤一列的两个条件?
【发布时间】:2019-03-31 17:58:31
【问题描述】:

例如,我有三列-ID 列、访问列、药物列。 Drug 列具有 A、B、C 和 D 的字符值。问题是每个 ID 都只有 A 或 B 或 C 或 D 或 A 和 B 的组合。

ID  Visit Drug 
1   1       A
1   2       B
1   3       A
2   1       B
2   2       B
3   1       C
3   2       C

所以如果我想过滤只有药物 B 的 ID(它不能同时包含 A 和 B),我该如何过滤呢?从上面看,我只想要 ID 2 而不是 ID 1,因为 ID 1 同时具有 A 和 B。

我尝试了这段代码,但它给了我错误的结果

df %>% 
group_by(id) %>% 
filter(drug == "B" | drug != "A" & drug != "B" )

任何帮助将不胜感激!

【问题讨论】:

    标签: r filter conditional subset


    【解决方案1】:

    在这种情况下,您应该为整个 Drug 向量提供一个条件,如下所示的 all

    df %>% group_by(ID) %>% filter(all(Drug == "B"))
    # A tibble: 2 x 3
    # Groups:   ID [1]
    #      ID Visit Drug 
    #   <int> <int> <fct>
    # 1     2     1 B    
    # 2     2     2 B  
    

    【讨论】:

    • 如果我想同时过滤 A 和 B,那么我做同样的事情吗?...filter(all(drug_code == "A" & drug_code == "B")) 它给出我 0 观察
    • 你的意思是让ID等于1,在你的例子中?无论如何,all(drug_code == "A" &amp; drug_code == "B") 永远不会返回任何东西。以df$Drug[1:3] 为例,看看会发生什么:df$Drug[1:3] == "A" &amp; df$Drug[1:3] == "B" 会(以矢量化方式)同时查找其元素"A""B",这是不可能的。在这种情况下,您想要的是df %&gt;% group_by(ID) %&gt;% filter(all(c("A", "B") %in% Drug)),这意味着"A""B" 都存在于Drug 中。
    • 我建议采取df$Drug 并尝试anyall==!=x %in% yy %in% x 以获得对正在发生的事情的良好直觉.
    • 它将保留那些包含"A" 至少一次和至少一次"B"ID,只给出ID == 1。如果出现次数为零也可以,但Drug 的元素只能是"A""B",那么您应该使用df %&gt;% group_by(ID) %&gt;% filter(all(Drug %in% c("A", "B"))),将ID 作为1 和2。(意味着%in% 不是对称。)
    • 很高兴为您提供帮助。我想现在可以接受答案了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多