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

В следующем примере моя цель - показать годы, в которых последовательные числа в 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 Ответ

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

Это уродливо, но это работает:)

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

...