Подсчитать количество строк между двумя конкретными строками - PullRequest
0 голосов
/ 24 апреля 2019

Вопрос в том, что я хочу посчитать количество строк между двумя строками, чтобы эти две строки имели одно и то же значение.

Я нашел вопрос, похожий на меня, но разница в том, что я хочу посчитать число A после B в этом вопросе и сгруппировать по 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 <- 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)
 )

Значение в 3-м столбце может быть NA или o, или что угодно, так как я переместу его, так что это не проблема. Я хочу посчитать, сколько значений больше 0 находятся между двумя значениями 0.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Если я правильно понимаю, я думаю, что это будет делать то, что вы хотите

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 в число ненулевых значений в каждом из этих прогонов. Затем, наконец, мы избавляемся от нашей временной переменной группировки.

0 голосов
/ 25 апреля 2019

Это будет работать в более общей ситуации, чем существующий ответ, то есть также добавить счетчики для повторения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...