删除仅出现一次的子集化数据行

时间:2017-12-02 00:33:16

标签: r

(没有经验的编码员 - 对不起,如果简单的问题!)

我有两个数据框xy

  • x:包含一列唯一的数字ID
  • y:包含一列非唯一数字ID和一列可变数字代码(诊断医疗代码)

    y中的所有ID都在x中(并且在任一数据框中都没有额外的ID),但y中的ID可以重复多行。 y中的每个ID在相邻列中都有一个代码。这些代码可以在ID内和ID之间变化,每个ID可以有多个相同的代码(即,可以有多个相同的ID代码对)。

    我想要做什么:对于x中的每个ID(或y中唯一的ID列表),选择y中具有匹配ID的行并将其删除如果第二列中的代码仅针对该特定ID发生一次,则从y开始。 (或者,对于x中的每个ID,选择y中具有多次出现代码的匹配行,并使用这些ID代码对进行新的数据框。)

    我可能(可能?)我根本不需要使用x,因为yx中的ID完全相同,但只是在y中重复。


    我尝试使用for循环来制作一个新的df,但它似乎需要永远而且永远......

    df <- data.frame()
    for (a in x$id){
          r <- subset(y, id==a)
          s <- count(r, code) %>% subset(n > 1)
          t <- subset(r, code %in% s)
          df <- rbind(df, t)
         }
    

    (我确定这是非常低效的,请不要取笑我。还要从记忆中写下这个,希望它能运行。)

    示例数据框:

    y

    id      code
    12345   1092
    12345   1092
    12345   7448
    12345   2274
    74839   6117
    74839   8337
    90029   1092
    90029   1092
    90029   1092
    90029   5521
    90029   5521
    90029   9338
    

    x

    id
    12345
    74839
    90029
    

    输出最好是:

    id      code
    12345   1092
    12345   1092
    90029   1092
    90029   1092
    90029   1092
    90029   5521
    90029   5521
    


    有一个更好的方法吗?谢谢你的帮助。

  • 1 个答案:

    答案 0 :(得分:1)

    一种方式如下。首先,首先使用x中的id在y中对观测值进行子集化。然后,使用id和code对数据进行分组,并删除任何只有一个观察的组。

    library(dplyr)
    
    filter(y, id %in% x$id) %>%
    group_by(id, code) %>%
    filter(n() != 1) %>%
    ungroup
    

    另一种方式如下。

    filter(y, id %in% x$id) %>%
    group_by(id) %>%
    filter(!(!duplicated(code) & !duplicated(code, fromLast = TRUE))) 
    
    
    #     id  code
    #  <int> <int>
    #1 12345  1092
    #2 12345  1092
    #3 90029  1092
    #4 90029  1092
    #5 90029  1092
    #6 90029  5521
    #7 90029  5521