计算两个特定行之间的行数

时间:2019-04-24 20:09:58

标签: r

问题是我要计算两行之间具有相同值的两行之间的行数。

我发现了一个与我相似的问题,但不同之处是我想计算该问题中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的值。

非常感谢。

2 个答案:

答案 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