Выбор подмножества столбцов во фрейме данных на основе двух столбцов из другого фрейма данных

#r #filter #subset

#r #Фильтр #подмножество

Вопрос:

У меня есть большой набор данных о встречах с пациентами (~ 6 миллионов). У каждого пациента может быть несколько записей каждый год в течение нескольких лет. Я хотел бы иметь возможность упорядочить пациентов по годам, а затем пронумеровать их, чтобы я мог отфильтровать все, кроме одного года, для каждого пациента, чтобы я мог просмотреть каждого пациента за их первый год в конкретном плане медицинского обслуживания.

Я могу ранжировать и отфильтровывать первую запись для каждого пациента, однако я думал, что мне придется создать новый df и подмножество исходного фрейма данных на основе двух столбцов, сгенерированных в моем новом фрейме данных, используя %в%. Вот тут-то у меня и возникают проблемы.

Хотя я часто использую stack overflow для поиска решений своих вопросов, я обычно не публикую сообщения, так что потерпите, если я делаю это неправильно.

 enrolid<- c(223801,223801, 223801, 223801, 223801, 223803, 223803, 223804)

year<- c(2008, 2008, 2009, 2010, 2011, 2008, 2011, 2008)

service<- c( "CT", "Colonoscopy", "labs", "office_visit", "med", "office_vist", "hospitalization", "CT")

#But for 6 million enounters. I want to me extract the enrolid and first #year for each individual in my data set.


df1<-data.frame(enrolid, year, service)

df2<- df1 %>% 
group_by(enrolid) %>% 
  filter(rank(year, ties.method="first")==1) %>% 
  mutate(enrollment_year_num = 1) %>% 
  select(enrolid, year)`

df1 %>% 
filter_all(any_vars(. %in% df2)) #tried with df2$enrolid amp; df2year

  

Спасибо!

Ответ №1:

Вы можете просто сделать все это за один шаг с помощью инструкции filter (убедитесь, что year для этого используется числовая переменная).

 df1 %>%
 group_by(enrolid) %>%
 filter(year == min(year))
  

Ответ №2:

Также можно использовать slice :

df1 %>% group_by(enrolid) %>% slice(which.min(year))