代码之家  ›  专栏  ›  技术社区  ›  f.lechleitner

计算某个值在列中出现的次数

  •  0
  • f.lechleitner  · 技术社区  · 6 年前

    我的数据框中有一列如下:

    > df
    # A tibble: 20 x 1
       duration
          <dbl>
     1     0   
     2    40.0 
     3   247.  
     4    11.8 
     5   116.  
     6    10.2 
     7   171.  
     8     7.58
     9    87.8 
    10    23.2 
    11   390.  
    12    35.8 
    13     4.73
    14    29.1 
    15     0   
    16    36.8 
    17    73.8 
    18    12.9 
    19   124.  
    20    10.7
    

    我需要对这些数据进行分组,以便从0开始到下一个0之前的最后一行的所有行都在一个组中。我用for循环完成了这个:

    counter <- 0
    
    df$group <- NA
    df$group[1] <- 1
    
    for (i in 2:NROW(df)) {
      df$group[i] <-
        ifelse(df$duration[i] == 0, df$group[i - 1] + 1, df$group[i - 1])
    }
    

    给了我想要的输出:

    > df
    # A tibble: 20 x 2
       duration group
          <dbl> <dbl>
     1     0        1
     2    40.0      1
     3   247.       1
     4    11.8      1
     5   116.       1
     6    10.2      1
     7   171.       1
     8     7.58     1
     9    87.8      1
    10    23.2      1
    11   390.       1
    12    35.8      1
    13     4.73     1
    14    29.1      1
    15     0        2
    16    36.8      2
    17    73.8      2
    18    12.9      2
    19   124.       2
    20    10.7      2
    

    但由于我的原始数据帧很大,我正在寻找一个更快的解决方案,我一直试图让它与dplyr一起工作,但没有效果。其他相关的问题是计算当前值出现的频率,而不是特定值,因此我还没有找到解决此问题的方法。

    我会感谢你帮助我找到一个矢量化的解决方案,谢谢!以下是示例数据:

    df <-
      structure(
        list(
          duration = c(
            0,
            40.0009999275208,
            247.248000144958,
            11.8349997997284,
            115.614000082016,
            10.2449998855591,
            171.426000118256,
            7.58200001716614,
            87.805999994278,
            23.1909999847412,
            390.417999982834,
            35.8229999542236,
            4.73100018501282,
            29.0869998931885,
            0,
            36.789999961853,
            73.8420000076294,
            12.8770000934601,
            123.771999835968,
            10.7190001010895
          )
        ),
        row.names = c(NA,-20L),
        class = c("tbl_df", "tbl", "data.frame")
      )
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   markus    6 年前

    我们可以使用 cumsum 如下所示

    df %>% 
      mutate(grp = cumsum(duration == 0))
    # A tibble: 20 x 2
    #   duration   grp
    #      <dbl> <int>
    # 1     0        1
    # 2    40.0      1
    # 3   247.       1
    # 4    11.8      1
    # 5   116.       1
    # 6    10.2      1
    # 7   171.       1
    # 8     7.58     1
    # 9    87.8      1
    #10    23.2      1
    #11   390.       1
    #12    35.8      1
    #13     4.73     1
    #14    29.1      1
    #15     0        2
    #16    36.8      2
    #17    73.8      2
    #18    12.9      2
    #19   124.       2
    #20    10.7      2