Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:按单个列和组统计连续出现的值_R_Count_Sequence - Fatal编程技术网

R:按单个列和组统计连续出现的值

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

我试图创建一个相等值的序列号,一个事件计数。但是,我希望在引入新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(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)