计算行数直到值发生变化然后继续计算 dplyr 中的下一个值

count rows until value changes then continue counting for the next value in dplyr

我想在 R 中使用细胞处于特定状态(1、2 或 3)的 运行 次来计算生存概率。因此,我试图计算一个单元格在不同 ID 中保持特定状态的行数。我只是不想要状态的总数,但我想要它在随时间变化之前发生的次数。

这是一个有代表性的数据框:

structure(list(id = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B"
), time = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21"
), state = c("1", "3", "3", "3", "2", "2", "2", "3", "3", "3", 
"2", "2", "2", "1", "1", "3", "2", "1", "3", "3", "3")), class = "data.frame", row.names = c(NA, 
-21L))
  id time state
1  A    1     1
2  A    2     3
3  A    3     3
4  A    4     3
5  A    5     2
6  A    6     2
 
df2 <- df %>%
  group_by (id) %>%
  summarise (statechange = count(state))

  id    statechange$x $freq      
1 A     1                 3
2 A     2                 6
3 A     3                 6
4 B     1                 1
5 B     2                 1
6 B     3                 4

理想情况下,结果应该是:

id  from  statechange   freq
A   NA  1       1
A   1   3       3
A   3   2       3
A   2   3       3
A   3   2       3
A   2   1       2
B   NA  3       1
B   3   2       1
B   2   1           1
B   1   2       3

其中 from 是更改前的原始状态,而 statechange 是正在计算的状态。

我不知道是否应该对计数使用 ifelse 语句,或者是否有其他方法可以实现此目的。如果有任何不清楚的地方,请告诉我,非常感谢您的帮助!

编辑:更改了问题以在生成的 df 中包含原始状态。

您可以使用 rle 来获取结果。但是,根据您的示例数据,我得到的结果与您发布的预期输出不同。

library(tidyverse)
df %>%
  group_by(id) %>%
  summarize(statechange = as.numeric(rle(state)[[2]]),
            freq = rle(state)[[1]]) %>%
  ungroup()

# A tibble: 10 x 3
   id    statechange  freq
   <chr>       <dbl> <int>
 1 A               1     1
 2 A               3     3
 3 A               2     3
 4 A               3     3
 5 A               2     3
 6 A               1     2
 7 B               3     1
 8 B               2     1
 9 B               1     1
10 B               3     3