计算行数直到值发生变化然后继续计算 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
我想在 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