Подсчет последовательных строк с одинаковым / отсутствующим значением - PullRequest
1 голос
/ 14 января 2020

У меня есть набор данных временного ряда, содержащий различные измерения датчика. В программном обеспечении датчиков есть некоторые ошибки, которые приводят к отсутствию измерений. Я добавил недостающее время измерения, в результате чего в столбце «значение» появились NA. Набор данных выглядит следующим образом:

df <- structure(list(time_id = 1:10, value = c(-1.80603125680195, -0.582075924689333, 
                                              NA, NA, -0.162309523556819, NA, NA, NA, 1.6059096288573, NA), 
                    is_missing = c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, 
                                   TRUE, FALSE, TRUE)), class = c("tbl_df", "tbl", "data.frame"
                                   ), row.names = c(NA, -10L))
df

Я хочу сгруппировать последовательные строки с нумерацией c против пропущенных значений и в то же время посчитать количество последовательных строк в каждой группе. Результат должен выглядеть следующим образом:

df %>% mutate(group = c(1, 1, 2, 2, 3, 4, 4, 4, 5, 6),
              seq_NA = c(1:2, 1:2, 1, 1:3, 1, 1))

Помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Вот еще одна идея. Здесь мы используем is.na() для захвата NA и изменения группы всякий раз, когда появляется не-NA, то есть

df %>% 
 group_by(grp = cumsum(c(1, diff(is.na(value)) != 0))) %>% 
 mutate(seq_NA = seq(n()))

, что дает

# A tibble: 10 x 5
# Groups:   grp [6]
   time_id  value is_missing   grp seq_NA
     <int>  <dbl> <lgl>      <dbl>  <int>
 1       1 -1.81  FALSE          1      1
 2       2 -0.582 FALSE          1      2
 3       3 NA     TRUE           2      1
 4       4 NA     TRUE           2      2
 5       5 -0.162 FALSE          3      1
 6       6 NA     TRUE           4      1
 7       7 NA     TRUE           4      2
 8       8 NA     TRUE           4      3
 9       9  1.61  FALSE          5      1
10      10 NA     TRUE           6      1 
1 голос
/ 14 января 2020

Вот базовое решение R с использованием ave() + rle()

df$group <- with(df, rep(seq_along(z<-rle(is_missing)$lengths),z))
df$seq_NA <- with(df,ave(seq(nrow(df)),group,FUN = seq_along))

таким, что

> df
   time_id      value is_missing group seq_NA
1        1 -1.8060313      FALSE     1      1
2        2 -0.5820759      FALSE     1      2
3        3         NA       TRUE     2      1
4        4         NA       TRUE     2      2
5        5 -0.1623095      FALSE     3      1
6        6         NA       TRUE     4      1
7        7         NA       TRUE     4      2
8        8         NA       TRUE     4      3
9        9  1.6059096      FALSE     5      1
10      10         NA       TRUE     6      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...