Это мой фрейм данных:
date <- as.Date(c("1993-09-21", "1994-02-12", "1994-02-23", "1994-05-14", "1994-08-18", "1994-08-25", "1994-08-29", "1994-09-17", "1994-10-16", "1994-10-16", "1994-10-22", "1994-10-26", "1994-12-26", "1995-04-12", "1995-05-04", "1995-06-20", "1995-07-11", "1995-07-27", "1995-08-14", "1995-08-15", "1995-08-22", "1995-08-27", "1995-08-27", "1995-08-28", "1995-08-30", "1995-08-30", "1995-09-03", "1995-09-03", "1995-09-03", "1995-09-15"))
value <- c(2, 1, 1, 1, 2, 1, 2, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1)
df <- data.frame(date, value)
df$value.equals.1 <- df$value == 1
Мне нужны две вещи: (1) первая и последняя дата каждой последовательной серии значений 1 (2) Длина каждой последовательной серии значений 1.
Я добавил в фрейм данных то, что мне нужно. Как я могу добиться этого в R?





Мы можем сделать это с помощью rleid от data.table. Создайте группирующую переменную с помощью rleid на 'value.equals.1', подмножество 'date' на основе 'value.equals.1' и извлеките первую и последнюю 'date', сгруппированные по 'grp'
library(data.table)
setDT(df)[, date[value.equals.1], .(grp = rleid(value.equals.1))
][, .(date = c(V1[1], V1[.N]), n = .N), by = grp][, grp := NULL][]
# date n
# 1: 1994-02-12 3
# 2: 1994-05-14 3
# 3: 1994-08-25 1
# 4: 1994-08-25 1
# 5: 1994-10-22 1
# 6: 1994-10-22 1
# 7: 1994-12-26 8
# 8: 1995-08-15 8
# 9: 1995-08-27 3
#10: 1995-08-30 3
#11: 1995-09-03 2
#12: 1995-09-15 2
Или это можно сделать с помощью tidyverse
library(dplyr)
df %>%
group_by(grp = rleid(value.equals.1)) %>%
filter(all(value.equals.1)) %>%
mutate(n = n()) %>%
slice(c(1, n())) %>%
ungroup %>%
select(date, n)
# A tibble: 12 x 2
# date n
# <date> <int>
# 1 1994-02-12 3
# 2 1994-05-14 3
# 3 1994-08-25 1
# 4 1994-08-25 1
# 5 1994-10-22 1
# 6 1994-10-22 1
# 7 1994-12-26 8
# 8 1995-08-15 8
# 9 1995-08-27 3
#10 1995-08-30 3
#11 1995-09-03 2
#12 1995-09-15 2
Или используйте rle из base R для создания группы
grp <- inverse.rle(within.list(rle(df$value.equals.1), values <- seq_along(values)))
do.call(c, lapply(with(df, split(date[value.equals.1],
grp[value.equals.1])), function(x) c(x[1], x[length(x)])))
Также необходимо, чтобы выводимый фрейм данных включал длину каждой последовательной серии значений 1. Как мне это сделать?
@luciano Обновил пост
См. stackoverflow.com/questions/49480065/…