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