r - отфильтровать все записи, показывающие два разных значения коэффициента в общий год - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть большой набор данных (3,2 млн записей) по среднегодовым средним показателям содержания химических веществ в воде (Chem_ID), организованных по местам мониторинга (Site_ID) и годам отбора проб (год), таким как:

data= data.frame(Site_ID=c(1, 1, 1, 2, 2, 2, 3, 3, 3), Chem_ID=c(A, B, B, A, C, C, A, A, B), Year=c(2001, 2001, 2003, 2001, 2003, 2004, 2002, 2003, 2004), AnnualMean=c(1.1, 1.2, 1.1, 2.1, 2.6, 3.1, 2.7, 2.6, 1.9))

Я бы хотел фильтровать только записи с сайтов мониторинга, которые показывают измерения для химических соединений A и B в общий год. Мои Chem_ID являются факторами. Результатом этого фильтра на вышеупомянутом элементе data.frame будет:

data= data.frame(Site_ID=c(1, 1), Chem_ID=c(1, 2), Year=c(2001, 2001), AnnualMean=c(1.1, 1.2))

Конечный результат - отфильтровать как можно больше пар Chem_ID = A и Chem_ID = B с одного и того же сайта и в те же годы, чтобы вычислить как много крыс ios Chem_ID = 1 / Chem_ID = 2, насколько это возможно. Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Вы можете сделать:

library(dplyr)

categs <- c('A', 'B')

data %>%
  group_by(Site_ID, Year) %>%
  filter(all(categs %in% as.character(Chem_ID)))

или аналогично в data.table:

library(data.table)

categs <- c('A', 'B')

setDT(data)[, .SD[all(categs %in% as.character(Chem_ID))], by = .(Site_ID, Year)]
1 голос
/ 28 апреля 2020

Базовая опция R использует subset + ave

dataout <- subset(data,
                  as.logical(ave(as.character(Chem_ID),
                                 Site_ID,
                                 Year,
                                 FUN = function(v) all(c("A","B")%in%v))))

, так что

> dataout
  Site_ID Chem_ID Year AnnualMean
1       1       A 2001        1.1
2       1       B 2001        1.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...