簡體   English   中英

基於 r 中兩列的頻率計數

[英]Frequency count based on two columns in r

我只有一個 dataframe 如下。

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 中,使用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)) 

使用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

代表 package (v1.0.0) 於 2021 年 2 月 26 日創建

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM