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

Я работаю с экстремально сухими событиями и пытаюсь получить некоторую информацию об их характеристиках. Это пример моих данных:

   dat <- data.frame(length= c(39,1,1,1,98,1,1,1,57,1,1,1,34,1,1), value = c(0,-1.111,-1.645,-1.285,0,-1.223,-1.369,-1.007,0,-1.083,-1.675,-1.119,0,-1.554,-1.6228))

Строки - месяцы, поэтому в столбце «длина» указывается сухой месяц с номером 1, а в столбце «значение» записывается серьезность этого сухого события. Я хотел бы получить, с одной стороны, среднюю и максимальную продолжительность сухих событий, но рассматривая каждую группу последовательных сухих месяцев (длина = 1) как событие (красные прямоугольники); с другой стороны, я хотел бы рассчитать медиану и минимальные значения тяжести всех сухих событий в серии.

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

enter image description here

Мой главный вопрос заключается в том, как я могу рассматривать группы последовательных строк со значением 1 в столбце «длина» как уникальный случай и вычислять эту простую статистику.

Заранее большое спасибо за любую оказанную помощь.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Полностью dplyr решение:

library(tidyverse)
dat2 <- dat %>%
  mutate(zero_count = if_else(value == 0, 1, 0), 
         group_id = cumsum(zero_count)) %>% 
  filter(length == 1) %>% 
  group_by(group_id) %>%
  summarise(mean = mean(value), median = median(value), months = length(group_id))

Сначала я добавил новый столбец, чтобы пометить, если есть нулевое значение. Затем новый столбец, который мы суммируем, чтобы мы могли идентифицировать каждую группу последовательно / индивидуально. Затем сгруппируйте по этому новому столбцу и отфильтруйте остальные строки, которые не принадлежат. Наконец подведите итог, чтобы получить статистику.

  group_id  mean median months
     <dbl> <dbl>  <dbl>  <int>
1        1 -1.35  -1.28      3
2        2 -1.20  -1.22      3
3        3 -1.29  -1.12      3
4        4 -1.59  -1.59      2
0 голосов
/ 24 января 2019

Один из вариантов - создать группирующую переменную с идентификатором длины выполнения (rleid), а затем использовать ее для summarise «значения» для median, min и другой интересующей статистики (т. Е. количество рядов - n())

library(dplyr)
library(data.table)
dat %>% 
    group_by(grp = rleid(length == 1)) %>% 
    filter(length == 1) %>% 
    summarise(Length = n(), Median = median(value), Min = min(value))

Или аналогично data.table, сначала создав переменную группировки с rleid, сгруппированную по 'grp' и указав i с логическим выражением для подстановки строк, длина которых равна только 1 в длине ', получите median и min (или max) в столбце "значение"

library(data.table)
setDT(dat)[, grp := rleid(length==1)][length == 1, 
   .(Length = .N, Median = median(value), Min = min(value)), .(grp)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...