【问题标题】:Delete a row based on a two seperate matching requirements根据两个单独的匹配要求删除一行
【发布时间】:2018-10-02 03:46:51
【问题描述】:

如果有关于此的帖子,我深表歉意 - 我多次搜索答案,但找不到任何有效的答案。

我需要做的是删除以下示例中等于 66 的所有行,前提是存在重复的动物类型,但不是 66。

animals <- c("dog", "dog", "dog", "cat", "cat", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,66,2,66,66,66,66,2,1)

df <- data.frame(animals,number)

使用该 df 我想删除第 3 行,因为 dog 具有其他值 1 和 2,我想删除 cat 的两个 66,因为有一只猫的其他值为 2 但我不想删除要么是鼠标条目,因为它们都是 66,我不想用 rat 删除任何东西,因为没有 66 值。

我会得到类似这样的结果:

animals <- c("dog", "dog", "cat", "mouse", "mouse", "rat", "rat")
number <- c(1,2,2,66,66,2,1) 

在真实的数据集中有太多的条目,你根本无法使用计数并删除总计少于 66 的所有内容(这是我的第一直觉)

这是我的第二次尝试,但由于某种原因无法考虑。

df(!number == 66 | if(unique(animals) ==

可能涉及到哪个语句?任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    一种使用基数 R ave 的方法,我们检查是否有任何动物的数字不是 66,如果有,则返回忽略 66 的数字,否则返回所有行。

    df[with(df, ave(number != 66, animals, FUN = function(x) if (any(x)) x else !x)), ]
    
    
    #  animals number
    #1     dog      1
    #2     dog      2
    #3     cat      2
    #4   mouse     66
    #5   mouse     66
    #6     rat      2
    #7     rat      1
    

    dplyr 版本将 filter 包含所有 66 的组,否则忽略包含 66 的行。

    library(dplyr)
    
    df %>%
       group_by(animals) %>%
       filter(all(number == 66) | number != 66)
    
    # animals number
    #  <fct>    <dbl>
    #1 dog          1
    #2 dog          2
    #3 cat          2
    #4 mouse       66
    #5 mouse       66
    #6 rat          2
    #7 rat          1
    

    【讨论】:

      【解决方案2】:

      使用 dplyr

      library(dplyr)
      df %>% group_by(animals) %>%
        mutate(Flag= case_when( number %in% c(1,2) ~ 1,
                                all(number == 66) ~ 1,
                                number == 66 ~ 0)) %>% 
        filter(Flag==1) %>% select(-Flag) %>% ungroup()
      
      
      # A tibble: 7 x 2
      animals number
      <chr>    <dbl>
      1 dog         1.
      2 dog         2.
      3 cat         2.
      4 mouse      66.
      5 mouse      66.
      6 rat         2.
      7 rat         1.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        相关资源
        最近更新 更多