Подтвердить что ты не робот

Как выбрать первую строку в кадре данных R, который соответствует определенным критериям?

Как выбрать первую строку кадра данных R, которая соответствует определенным критериям?

Вот контекст:

У меня есть кадр данных с пятью столбцами:

"pixel", "year","propvar", "component", "cumsum." 

Есть 1,225 комбинаций pixel и year, потому что данные были вычислены из ежегодного временного ряда из 49 географических пикселей для каждого из 25 учебных лет. В течение каждого пиксельного года я вычислил propvar, долю от общей дисперсии, объясненную данным компонентом быстрого преобразования Фурье для временных рядов данного пиксельного года. Затем я вычислил cumsum, который является суммарной суммой propvar для каждой частотной составляющей в пиксельном году. Столбец component просто дает вам индекс для компонента ряда Фурье (плюс 1), из которого был рассчитан propvar.

Я хочу определить количество компонентов, необходимых для объяснения более 99% дисперсии. Я считаю, что один из способов сделать это - найти первую строку в каждом пиксельном году, где cumsum > 0.99, и создать из нее кадр данных с тремя столбцами, pixel, year и numbercomps, где numbercomps - количество компонентов, требуемых в течение данного пиксельного года, чтобы объяснить более 99% дисперсии. Я не знаю, как это сделать в R. Кто-нибудь имеет решение?

4b9b3361

Ответ 1

Конечно. Что-то вроде этого должно сделать трюк:

# CREATE A REPRODUCIBLE EXAMPLE!
df <- data.frame(year = c("2001", "2003", "2001", "2003", "2003"),
                 pixel = c("a", "b", "a", "b", "a"), 
                 cumsum = c(99, 99, 98, 99, 99),
                 numbercomps=1:5)
df
#   year pixel cumsum numbercomps
# 1 2001     a     99           1
# 2 2003     b     99           2 
# 3 2001     a     98           3
# 4 2003     b     99           4
# 5 2003     a     99           5

# EXTRACT THE SUBSET YOU'D LIKE.
res <- subset(df, cumsum>=99)
res <- subset(res, 
              subset = !duplicated(res[c("year", "pixel")]),
              select = c("pixel", "year", "numbercomps"))
#   pixel year numbercomps
# 1     a 2001           1
# 2     b 2003           2
# 5     a 2003           5

EDIT Кроме того, для тех, кто интересуется data.table, существует следующее:

library(data.table)
dt <- data.table(df, key="pixel, year")    
dt[cumsum>=99, .SD[1], by=key(dt)]