【问题标题】:Frequency count based on two columns in r基于 r 中两列的频率计数
【发布时间】:2021-05-28 14:47:36
【问题描述】:

我只有一个如下数据框。

df=data.frame(o=c(rep("a",12),rep("b",3)), d=c(0,0,1,0,0.3,0.6,0,1,2,3,4,0,0,1,0))

> df
   o   d
1  a 0.0
2  a 0.0
3  a 1.0
4  a 0.0
5  a 0.3
6  a 0.6
7  a 0.0
8  a 1.0
9  a 2.0
10 a 3.0
11 a 4.0
12 a 0.0
13 b 0.0
14 b 1.0
15 b 0.0

我想添加一个基于“o”和“d”列计算频率的新列。 如果列 'd' 的值为零,则频率应从 1 重新开始,如下所示(手工制作)。

> df_result
   o   d freq
1  a 0.0    1
2  a 0.0    2
3  a 1.0    2
4  a 0.0    3
5  a 0.3    3
6  a 0.6    3
7  a 0.0    5
8  a 1.0    5
9  a 2.0    5
10 a 3.0    5
11 a 4.0    5
12 a 0.0    1
13 b 0.0    2
14 b 1.0    2
15 b 0.0    1

【问题讨论】:

    标签: r dataframe count frequency


    【解决方案1】:

    在基础 R 中,使用 ave

    df$freq <- with(df, ave(d, cumsum(d == 0), FUN = length))
    df
    
    #   o   d freq
    #1  a 0.0    1
    #2  a 0.0    2
    #3  a 1.0    2
    #4  a 0.0    3
    #5  a 0.3    3
    #6  a 0.6    3
    #7  a 0.0    5
    #8  a 1.0    5
    #9  a 2.0    5
    #10 a 3.0    5
    #11 a 4.0    5
    #12 a 0.0    1
    #13 b 0.0    2
    #14 b 1.0    2
    #15 b 0.0    1
    

    dplyr

    library(dplyr)
    df %>% add_count(grp = cumsum(d == 0)) 
    

    【讨论】:

    • 是的,我应该但实际上按o 分组是多余的,因为每次d = 0 都会自动创建一个新组。
    • 如果 OP 的数据中存在这种情况,我不确定输出应该是什么,也许他们可以扩展示例以澄清它。
    • 正如@Ronak Shah 所说,每次d = 0 都会自动创建一个新组。在我的数据中。非常感谢。
    【解决方案2】:

    使用 data.tables 和 @Ronak Shah 方法

    df=data.frame(o=c(rep("a",12),rep("b",3)), d=c(0,0,1,0,0.3,0.6,0,1,2,3,4,0,0,1,0)) 
    
    library(data.table)
    
    setDT(df)[, freq := .N, by = cumsum(d == 0)]
    
    df
    #>     o   d freq
    #>  1: a 0.0    1
    #>  2: a 0.0    2
    #>  3: a 1.0    2
    #>  4: a 0.0    3
    #>  5: a 0.3    3
    #>  6: a 0.6    3
    #>  7: a 0.0    5
    #>  8: a 1.0    5
    #>  9: a 2.0    5
    #> 10: a 3.0    5
    #> 11: a 4.0    5
    #> 12: a 0.0    1
    #> 13: b 0.0    2
    #> 14: b 1.0    2
    #> 15: b 0.0    1
    

    reprex package (v1.0.0) 于 2021 年 2 月 26 日创建

    【讨论】:

      【解决方案3】:

      使用rle()的另一个答案

      df$freq <- with(rle(cumsum(df$d == 0)), rep(lengths, lengths))
      df
      
         o   d freq
      1  a 0.0    1
      2  a 0.0    2
      3  a 1.0    2
      4  a 0.0    3
      5  a 0.3    3
      6  a 0.6    3
      7  a 0.0    5
      8  a 1.0    5
      9  a 2.0    5
      10 a 3.0    5
      11 a 4.0    5
      12 a 0.0    1
      13 b 0.0    2
      14 b 1.0    2
      15 b 0.0    1
      

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2012-06-08
        • 1970-01-01
        • 2020-06-30
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多