Как выбрать первую строку в кадре данных 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. Кто-нибудь имеет решение?
Ответы
Ответ 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)]