R 计算两个特定行之间的行数
问题是我想计算两行之间的行数,这两行共享相同的值 我发现了一个与我类似的问题,但不同的是我想计算该问题中B之后a的数量,并按id分组(可能没有必要,因为在我的数据中,每个id的起始值始终为0) 链接在这里 假设我有如下数据R 计算两个特定行之间的行数,r,R,问题是我想计算两行之间的行数,这两行共享相同的值 我发现了一个与我类似的问题,但不同的是我想计算该问题中B之后a的数量,并按id分组(可能没有必要,因为在我的数据中,每个id的起始值始终为0) 链接在这里 假设我有如下数据 a <- data.frame( id = c(1, 1, 1, 1, 2, 2, 2, 2, 2), visits = c(0, 0, 1, 0, 0, 1, 2, 0, 0) ) a如果我理解正确,我想这会满足您的要求 libra
a <- data.frame(
id = c(1, 1, 1, 1, 2, 2, 2, 2, 2),
visits = c(0, 0, 1, 0, 0, 1, 2, 0, 0)
)
a如果我理解正确,我想这会满足您的要求
library(dplyr)
a %>%
group_by(id) %>%
mutate(grp=cumsum(visits==0)) %>%
group_by(id, grp) %>%
mutate(z=ifelse(visits!=0, NA, sum(visits!=0))) %>%
ungroup() %>% mutate(grp=NULL)
在这里,我们使用第一个mutate中的cumsum()
将数据“拆分”为零,并运行非零。然后我们根据这些运行进行分组,并通过将z设置为每个运行中的非零数量来创建变量。最后,我们去掉了临时分组变量。这将在比现有答案更一般的设置下工作,也就是说,还添加重复1
的计数和任何其他值。每组的最后一行是NA
,但这很容易更改
a %>%
group_by(id) %>%
mutate(
c = map_dbl(
seq_along(visits),
~ {
m <- which(visits[.x] == visits[-seq(.x)])
if (length(m) == 0) NA else min(m) - 1
}
)
)
# A tibble: 9 x 3
# Groups: id [2]
id visits c
<dbl> <dbl> <dbl>
1 1 0 0
2 1 0 1
3 1 1 NA
4 1 0 NA
5 2 0 2
6 2 1 NA
7 2 2 NA
8 2 0 0
9 2 0 NA
a%>%
分组依据(id)%>%
变异(
c=map_dbl(
顺序(参观),
~ {
m我无法从你的输出中理解你在追求什么。什么是事件“A”和“B”这里?你想z
包含下一个零值之前出现的非零值的数量?A,B只是我找到的问题中的一个例子。对于我的数据,我想用z来计算零值之后出现的非零值的数量。我希望这能让我的问题清楚,谢谢
a %>%
group_by(id) %>%
mutate(
c = map_dbl(
seq_along(visits),
~ {
m <- which(visits[.x] == visits[-seq(.x)])
if (length(m) == 0) NA else min(m) - 1
}
)
)
# A tibble: 9 x 3
# Groups: id [2]
id visits c
<dbl> <dbl> <dbl>
1 1 0 0
2 1 0 1
3 1 1 NA
4 1 0 NA
5 2 0 2
6 2 1 NA
7 2 2 NA
8 2 0 0
9 2 0 NA