Как выбрать первую строку в фрейме данных R, которая соответствует определенным критериям? - PullRequest
11 голосов
/ 16 ноября 2011

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

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

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

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

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

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

1 Ответ

19 голосов
/ 16 ноября 2011

Конечно. Нечто подобное должно сработать:

# 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

РЕДАКТИРОВАТЬ Кроме того, для тех, кто заинтересован в data.table, есть это:

library(data.table)
dt <- data.table(df, key="pixel, year")    
dt[cumsum>=99, .SD[1], by=key(dt)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...