【问题标题】:using R: drop rows efficiently based on different conditions使用 R:根据不同的条件有效地删除行
【发布时间】:2021-05-19 19:05:12
【问题描述】:

考虑这个示例

df<-{data.frame(v0=c(1, 2, 5, 1, 2, 0, 1, 2, 2, 2, 5),v1=c('a', 'a', 'a', 'b', 'b', 'c', 'c', 'b', 'b', 'a', 'a'), v2=c(0, 10, 5, 1, 8, 5,10, 3, 3, 1, 5))}

对于大型数据框:如果 v0>4,则删除所有包含对应值 v1 的行(删除一个组?)。

因此,这里的结果应该是一个数据框删除所有带有“a”的行,因为“a”的 v0 值为 5。

df_ExpectedResult<-{data.frame(v0=c( 1, 2, 0, 1, 2, 2 ),v1=c( 'b', 'b', 'c', 'c', 'b', 'b'), v2=c(1, 8, 5,10, 3, 3))} 

另外,我想要一个新的数据框来保存已删除的组。

df_Dropped <- {data.frame(v1='a')}

对于庞大的数据集,您将如何有效地执行此操作?我正在使用一个简单的 for 循环和 if 语句,但操作时间太长。

【问题讨论】:

    标签: r dataframe large-data drop


    【解决方案1】:

    dplyr 的选项

    library(dplyr)
    df %>%
        group_by(v1) %>%
        filter(sum(v0 > 4) < 1) %>%
        ungroup
    

    -输出

    # A tibble: 6 x 3
    #     v0 v1       v2
    #  <dbl> <chr> <dbl>
    #1     1 b         1
    #2     2 b         8
    #3     0 c         5
    #4     1 c        10
    #5     2 b         3
    #6     2 b         3
    

    【讨论】:

      【解决方案2】:

      使用subset + ave 的基本 R 选项

      subset(df, !ave(v0 > 4, v1, FUN = any))
      

      给予

        v0 v1 v2
      4  1  b  1
      5  2  b  8
      6  0  c  5
      7  1  c 10
      8  2  b  3
      9  2  b  3
      

      【讨论】:

        【解决方案3】:

        这是两个操作,但是这个呢:

        drop_groups <- df %>% filter(v0 > 4) %>% select(v1) %>% unique()
        df_result <- df %>% filter(!(v1 %in% drop_groups))
        df_result
        #   v0 v1 v2
        # 1  1  b  1
        # 2  2  b  8
        # 3  0  c  5
        # 4  1  c 10
        # 5  2  b  3
        # 6  2  b  3
        

        【讨论】:

          猜你喜欢
          • 2020-09-02
          • 1970-01-01
          • 2019-03-26
          • 2018-09-21
          • 2015-08-31
          • 2021-06-09
          • 2020-05-22
          • 1970-01-01
          • 2021-12-08
          相关资源
          最近更新 更多