【问题标题】:Subsetting with 2 conditions not working with which function具有 2 个条件的子集不适用于哪个功能
【发布时间】:2016-11-19 12:56:37
【问题描述】:

我一直试图在 Stackoverflow 上找到类似的问题,但所有类似的问题仍然无法回答我的问题或解决此问题。

我有这个数据集,使用which() 和其他函数,我试图找到两个条件都为真的id。但是,我不知道如何让它在 R 中工作。它要么返回所有 id,要么返回我迄今为止尝试过的空向量。

所以我从我的数据中抽取了 20 个观察结果,仅针对这个问题(实际数据框很大),以生成一个模拟样本来传达我的问题并在 Stackoverflow 上解决它,但我会尝试。

我有这个数据框,我想要严格包含附件 V 和附件 R 的 ID。

df
          id attachment 
271  1000534          V      
372  1000547          V      
1012 1000530          R      
1568 1000539          R     
1095 1000530          R      
185  1000534          V      
1476 1000539          R      
903  1000530          R      
309  1000547          V      
1010 1000530          R      
333  1000547          V      
1094 1000530          R      
1334 1000539          R      
340  1000547          V      
730  1000530          R      
22   1000067          V     
1308 1000533          R      
799  1000530          R      
138  1000533          V      
1161 1000530          R      

所以,正如我们所见,id 1000533 同时具有 V 和 R,所以我想要捕获的 id 两者兼有,我尝试了以下选项:

VR <- df[(df$attachment == 'V') & (df$attachment == 'R'),]
VR <- df[(df$attachment == 'V') && (df$attachment == 'R'),]
VR <- df[which(df$attachment == 'V') && which(df$attachment == 'R'),]
VR <- df[which(df$attachment == 'V') & which(df$attachment == 'R'),]

但它们返回一个包含所有 20 个值的数据框。当我打电话时

unique(VR$id)

它从初始数据帧返回所有 id。使用我的实际数据,它会返回一个空数据框,具体取决于我尝试的上述哪种子集尝试,但它永远不会返回我想要的 - 一个只有包含附件 V 和附件 R 的 id(或观察值)的数据框。

我做错了什么以及如何仅提取同时具有 V 和 R 的那些 id?

【问题讨论】:

    标签: r conditional subset


    【解决方案1】:

    由于每个观察只有一个“依恋”级别,因此不可能同时拥有 V 和 R。

    由于 ID 在观察中重复,您可以使用 intersect 来实现您想要做的事情:

    myIds <- intersect(df$id[df$attachment == "V"], df$id[df$attachment == "R"])
    

    现在 myIds 将存储同时具有 V 和 R 的 id。

    myIds
    [1] 1000533
    

    在示例中是单个 id。


    如果您想要只有 V 附件而不是 R 附件的观察,您可以使用 setdiff 而不是 intersect

    myIds <- setdiff(df$id[df$attachment == "V"], df$id[df$attachment == "R"])
    

    这里要注意的一点是 intersect 是可交换的,因此输入参数的顺序无关紧要。对于setdiff,订单很重要。您可以将顺序解读为参数 1 中不在参数 2 中的元素。

    【讨论】:

    • 哇!成功了!我为此苦苦挣扎了很久,非常感谢!我还有一个问题:您会如何建议对 V 附件严格进行子集化?
    • @Imo 在我的评论中我想问我是否只想要附件 V,df[which(df$attachment == 'V') ,] 就足够了吗?
    • 是的,该代码将为所有观察结果提供一个 V 附件。我添加了一个稍微复杂一点的答案,即所有带有 v 附件但不带有 R 附件的 id。
    • @Imo 谢谢!所以在setdiff 中,函数内的第一个参数将捕获所有带有 V 的参数,但第二个参数将排除所有同时具有 V 和 R 的参数?跨度>
    【解决方案2】:

    @Imo 解决方案无疑是最紧凑的。 以下是使用reshape2 的变体。它的好处是提供有关每个 ID/附件组合出现多少次的额外信息:

    library(reshape2)
    output <- dcast(df, id ~ attachment)
    
    output
      id      R V
    1 1000067 0 1
    2 1000530 8 0
    3 1000533 1 1
    4 1000534 0 2
    5 1000539 3 0
    6 1000547 0 4
    

    要查找带有两个附件的 ID:

    output$id[output$R != 0 & output$V != 0]
    [1] 1000533
    

    查看哪些 ID 有附件 V 而不是 R:

    output$id[output$R == 0 & output$V != 0]
    

    查看哪些 ID 有附件 R 而不是 V:

    output$id[output$R != 0 & output$V == 0]
    

    【讨论】:

    • 请注意,开头部分本质上是table(df)
    【解决方案3】:

    这是dplyr的方法

    library(dplyr)
    df %>%
      group_by(id) %>%
      mutate(a = sort(paste0(unique(attachment), collapse = ""))) 
    

    返回这个:

            id attachment     a
         <int>     <fctr> <chr>
    1  1000534          V     V
    2  1000547          V     V
    3  1000530          R     R
    4  1000539          R     R
    5  1000530          R     R
    6  1000534          V     V
    7  1000539          R     R
    8  1000530          R     R
    9  1000547          V     V
    10 1000530          R     R
    11 1000547          V     V
    12 1000530          R     R
    13 1000539          R     R
    14 1000547          V     V
    15 1000530          R     R
    16 1000067          V     V
    17 1000533          R    RV
    18 1000530          R     R
    19 1000533          V    RV
    20 1000530          R     R
    

    现在您可以通过afilter 来满足您喜欢的任何条件。在这种情况下,只获取具有VRids

    df %>%
      group_by(id) %>%
      mutate(a = sort(paste0(unique(attachment), collapse = ""))) %>%
      filter(a == "RV") %>%
      ungroup() %>%
      distinct(id)
    

    您可以将过滤条件更改为仅查找 V 或其他任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      相关资源
      最近更新 更多