R:按单个列和组统计连续出现的值
我试图创建一个相等值的序列号,一个事件计数。但是,我希望在引入新ID后重置计数,即使行保持顺序 我的数据的外观示例:R:按单个列和组统计连续出现的值,r,count,sequence,R,Count,Sequence,我试图创建一个相等值的序列号,一个事件计数。但是,我希望在引入新ID后重置计数,即使行保持顺序 我的数据的外观示例: dataset <- data.frame(ID = c("a","a","a","a","a","a","a","b","b","b","b","b","b","b") dataset$YesNO <- c(1,1,0,0,0,1,1,1,1,1,0,0,0,0) 我使用了在这个论坛上找到的代码: dataset$Counter <- sequence(r
dataset <- data.frame(ID =
c("a","a","a","a","a","a","a","b","b","b","b","b","b","b")
dataset$YesNO <- c(1,1,0,0,0,1,1,1,1,1,0,0,0,0)
我使用了在这个论坛上找到的代码:
dataset$Counter <- sequence(rle(as.character(dataset$YesNo))$lengths)
我错过了哪一步让它根据ID重置
谢谢大家! 你可以做:
dataset$Counter <- with(dataset,
ave(YesNO, ID, FUN = function(x) sequence(rle(as.character(x))$lengths)))
使用rleid
(来自data.table包)获取分组变量,然后使用ave
沿该分组的公共值应用seq\u:
library(data.table)
transform(dataset, Counter = ave(YesNO, rleid(ID, YesNO), FUN = seq_along))
给予:
ID YesNO Counter
1 a 1 1
2 a 1 2
3 a 0 1
4 a 0 2
5 a 0 3
6 a 1 1
7 a 1 2
8 b 1 1
9 b 1 2
10 b 1 3
11 b 0 1
12 b 0 2
13 b 0 3
14 b 0 4
还有一个dplyr
可能性:
dataset %>%
group_by(ID, grp = with(rle(YesNO), rep(seq_along(lengths), lengths))) %>%
mutate(Counter = seq_along(grp)) %>%
ungroup() %>%
select(-grp)
ID YesNO Counter
<fct> <dbl> <int>
1 a 1. 1
2 a 1. 2
3 a 0. 1
4 a 0. 2
5 a 0. 3
6 a 1. 1
7 a 1. 2
8 b 1. 1
9 b 1. 2
10 b 1. 3
11 b 0. 1
12 b 0. 2
13 b 0. 3
14 b 0. 4
library(data.table)
transform(dataset, Counter = ave(YesNO, rleid(ID, YesNO), FUN = seq_along))
ID YesNO Counter
1 a 1 1
2 a 1 2
3 a 0 1
4 a 0 2
5 a 0 3
6 a 1 1
7 a 1 2
8 b 1 1
9 b 1 2
10 b 1 3
11 b 0 1
12 b 0 2
13 b 0 3
14 b 0 4
dataset %>%
group_by(ID, grp = with(rle(YesNO), rep(seq_along(lengths), lengths))) %>%
mutate(Counter = seq_along(grp)) %>%
ungroup() %>%
select(-grp)
ID YesNO Counter
<fct> <dbl> <int>
1 a 1. 1
2 a 1. 2
3 a 0. 1
4 a 0. 2
5 a 0. 3
6 a 1. 1
7 a 1. 2
8 b 1. 1
9 b 1. 2
10 b 1. 3
11 b 0. 1
12 b 0. 2
13 b 0. 3
14 b 0. 4
dataset %>%
group_by(ID, grp = with(rle(YesNO), rep(seq_along(lengths), lengths))) %>%
mutate(Counter = 1:n()) %>%
ungroup() %>%
select(-grp)