问题是我要计算两行之间具有相同值的两行之间的行数。
我发现了一个与我相似的问题,但不同之处是我想计算该问题中B之后的A的数目,并按id进行分组(可能没有必要,因为在我的数据中,每个值的起始值始终为0 ID) 链接在这里 Counting number of rows between rows
假设我下面显示的数据
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 <- data.frame(
id = c(1, 1, 1, 1, 2, 2, 2, 2, 2),
visits = c(0, 0, 1, 0, 0, 1, 2, 0, 0),
z = c(0, 1, NA, 0, 2, NA, NA, 0, 0)
)
第三列中的值可以是NA或o或其他任何值,因为我将其移动了,所以没有问题。我想计算两个0值之间有多少个大于0的值。
非常感谢。
答案 0 :(得分:1)
如果我理解正确,我想这会做你想要的
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)
在这里,我们在第一个突变中使用cumsum()
将数据“拆分”为零且运行非零。然后,我们将这些运行分组,并通过将z设置为每个运行中非零的数目来创建变量。最后,我们摆脱了临时分组变量。
答案 1 :(得分:0)
与现有答案相比,这将在更通用的设置中起作用,即,还会添加重复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