Использование rle() для индексации data.frame - как показать нули в функции, чтобы поддерживать одинаковую длину вектора?

В следующем примере моя цель - показать годы, в которых df транспонирован в df_new ниже чем threshold из -1.2 в 5 последовательные случаи. Я хочу затем вернуть соответствующие уникальные значения из столбца df_new$year в результате. Моя проблема с ссылками rle() Результатом функции является то, что длина не соответствует df_new$year длина и, следовательно, я не могу правильно его проиндексировать. Вопрос с rle() Функция заключается в том, что он не возвращает нули и, следовательно, возвращает только прогоны, по крайней мере, на 1 значение ниже threshold в k, Как я могу улучшить этот кусочек кода, чтобы достичь того, что мне нужно? Есть ли способ заставить rle() включить нули в k или я пойду с другим подходом?

# Example reproducible df:
set.seed(125)
df <- data.frame(V1=rnorm(10,-1.5,.5),
                 V2=rnorm(10,-1.5,.5),
                 V3=rnorm(10,-1.5,.5),
                 V4=rnorm(10,-1.5,.5),
                 V5=rnorm(10,-1.5,.5),
                 V6=rnorm(10,-1.5,.5),
                 V7=rnorm(10,-1.5,.5),
                 V8=rnorm(10,-1.5,.5),
                 V9=rnorm(10,-1.5,.5),
                 V10=rnorm(10,-1.5,.5))
library(data.table)
df_t <- t(df)
df_long <- melt(df_t)
df_long$year <- rep(1976:1985, each=nrow(df))
df_new <- data.frame(value=df_long$value,year=df_long$year)

# Threshold values:
 threshold = -1.2
    consecutiveentries = 5
    number <- consecutiveentries-1
# Start of the problem:
    k <- rle(df_new$value < threshold)
    years <- unique(df_new$year[k$lengths > number])

Текущий результат:

> years
[1] 1976 1978 1979 1980 1982 1984 1985

Что бы я хотел, чтобы это было:

> years
    [1] 1976 1980 1983 1985

1 ответ

Решение

Это некрасиво, но это работает:)

df_new$year[cumsum(k$lengths)[which(k$lengths >= 5)-1]+1]

Каждая часть:

idx <- which(k$lengths >= 5)-1 дает вам показатели k$lengths прямо перед значением выше или равно 4.

С cumsum(k$lengths) Затем мы строим накопленную сумму по k$lengths и взять элементы в idx, В результате мы имеем количество строк, которые встречаются до первой строки, которая является частью >=5 последовательность.

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

Другие вопросы по тегам