Определите, отвечали ли люди в информационном фрейме определенному условию за определенный период времени в R - PullRequest
1 голос
/ 31 мая 2019

У меня есть данные, которые выглядят так:

pop_df <- data.frame(
  uniq_ID = c("AFG1234", "WED1234", "POJ1234", "DER234", "QWE1234", "BGR1234", "ABC1234", "DSE1234", "UHJ1234", "POI234",
              "EDC1234", "BGT1234", "MJI1234", "WEX1234", "FGH1234", "UJN1234", "LOK1234", "DRT1234", "URD1234", "MVR1234",
              "AFG1234", "WED1234", "POJ1234", "DER234", "QWE1234", "BGR1234", "ABC1234", "DSE1234", "UHJ1234", "POI234",
              "EDC1234", "BGT1234", "MJI1234", "WEX1234", "FGH1234", "UJN1234", "LOK1234", "DRT1234", "URD1234", "MVR1234",
              "AFG1234", "WED1234", "POJ1234", "DER234", "QWE1234", "BGR1234", "ABC1234", "DSE1234", "UHJ1234", "POI234",
              "EDC1234", "BGT1234", "MJI1234", "WEX1234", "FGH1234", "UJN1234", "LOK1234", "DRT1234", "URD1234", "MVR1234",
              "AFG1234", "WED1234", "POJ1234", "DER234", "QWE1234", "BGR1234", "ABC1234", "DSE1234", "UHJ1234", "POI234",
              "EDC1234", "BGT1234", "MJI1234", "WEX1234", "FGH1234", "UJN1234", "LOK1234", "DRT1234", "URD1234", "MVR1234"),
  Quarter = c((rep("20170101",20)), (rep("20170401",20)), (rep("20170701",20)), (rep("20171001",20))),
  contact = sample(c(0,1), replace = T, size = 80),
  )

Это список уникальных идентификаторов, квартал (т. Е. Трехмесячный период в году), и указали ли они контакт с врачом втот квартал.Что я хочу знать, так это если кто-то вступил в контакт в течение всего 2017 года, основываясь на значении «контакта».Таким образом, для каждого уникального идентификатора, если contact == 1 в любом квартале, они установили контакт в 2017 году.

Мой желаемый результат - новая переменная с именем contact_year, где значение равно 1 для каждого уникального идентификатора, еслиэтот уникальный идентификатор вступил в контакт в любом квартале.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Можно было бы сгруппировать по 'uniq_ID' и проверить, есть ли any 'contact'

library(dplyr)
pop_df %>%
   group_by(uniq_ID) %>% 
   mutate(contact_year = as.integer(any(as.logical(contact))))

В примере OP были только данные за 2017 год.Если он также включает другие даты, мы можем создать логический индекс с &

pop_df %>%
    group_by(uniq_ID) %>% 
    mutate(contact_year = as.integer(any(as.logical(contact) & 
                               substr(Quarter, 1, 4) == 2017)))
1 голос
/ 31 мая 2019

Мы могли бы sum информация contact и найти uniq_ID, значение которого больше 0.

library(dplyr)

pop_df %>%
  group_by(uniq_ID) %>%
  mutate(contact_year = as.integer(sum(contact) > 0))

, которое в базе R будет использовать ave

pop_df$contact_year <- as.integer(with(pop_df, ave(contact, uniq_ID,FUN = sum) > 0))

Если у нас есть больше лет и мы хотели бы сделать это для каждого идентификатора в каждом году, мы можем извлечь информацию о году

library(dplyr)
library(lubridate)

pop_df %>%
  group_by(uniq_ID, year = year(ymd(Quarter))) %>%
  mutate(contact_year = as.integer(sum(contact) > 0))

Это даст вам то же количество строк, что и ваш исходный pop_df с contact_year информацией, повторяемой для каждого uniq_ID.Вы также можете рассмотреть возможность использования summarise в dplyr и aggregate в базе R, что даст вам только одну строку на ID.

...