【问题标题】:Excluding Observations that Include a Specific Value排除包含特定值的观察
【发布时间】:2015-12-29 17:15:59
【问题描述】:

我想排除包含特定值的观察。 也就是说,我的专栏中的观察结果如下所示:501.512.518。 这些代表每次观察的三个不同的个体。 现在我想排除所有包含例如的观察。个人512

有没有办法创建子样本,可以排除包含值 512 但不等于或以值 512 开头的观测值?

【问题讨论】:

    标签: r


    【解决方案1】:

    这个问题缺少一些细节,但我希望这能有所帮助。我会使用 grepl 函数。
    为了删除数据集中(其中一个)列(表示为 col)包含(但不以)512 开头的所有行,请执行以下操作:

    newDF <- oldDT[!grepl('.512', oldDF$col), ]
    

    grepl('.512', oldDF$col) 将在每次列“col”具有模式“.512”时返回具有 TRUE 的逻辑向量在里面。
    它前面的 ! 将否定它,从而删除这些行。
    希望对您有所帮助。

    【讨论】:

    • 像魅力塔尔一样工作,谢谢!
    • 作为旁注。如果你想使用更快的 dplyr 包,你可以使用@steveb 描述的符号来实现。如果您需要示例,请告诉我。
    • 你可能想要 '\\.512' 因为点会自己匹配任何东西,所以原来的会匹配 0512 或 3512。你可以通过让它匹配512 之后的行或非数字(使其与 5128 不匹配)与“\\.512([^0-9]|$)”之类的内容。当然,如果所有的 ID 号都是 3 位数字,那么这就有点过分了(在这种情况下,您可以使用 fixed 到 grepl 的参数来加快速度)。
    • 亲爱的约翰,请认真对待@Snow 评论并重新检查您的结果。确实使用点(“。”)而不转义它可能会产生副作用。对此感到抱歉。
    【解决方案2】:

    如果您有一个更具体的示例但做出一些假设,并且使用dplyr 您可以执行以下操作,将会很有帮助:

    exclusion_values <- c(501, 512, 518)
    new_df <- old_df %>% filter(! col_of_interest %in% exclusion_values)
    

    这是你要找的吗?

    【讨论】:

      【解决方案3】:

      @steveb 提供的答案很棒,但您可能想要一个基本的 R 替代方案:

      mtcars 数据集示例

      df <- data.frame(Group = rep(c('A', 'B', 'C', 'D'), 50),
                       Number = sample(500:600, 200, replace = T))
      

      to_drop

      df <- df[!(df$Number %in% to_drop),]
      
       > df
          Group Number
      1       A    518
      2       B    536
      3       C    518
      4       D    505
      5       A    544
      6       B    511
      7       C    507
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 2019-07-30
        相关资源
        最近更新 更多