确定数据框中的个人是否在 R 中的给定时间段内满足特定条件

Determine if individuals in a dataframe met a certain condition in a given time period in R

我有这样的数据

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),
  )

这是一个包含唯一 ID、季度(即一年中的三个月)以及他们是否在该季度与医生联系的列表。 我想知道的是,根据 "contact" 的值,是否有人在 2017 年全年进行过联系。 因此,对于每个唯一 ID,如果任何季度的联系人 == 1,则他们在 2017 年进行了联系。

我想要的输出是一个名为 contact_year 的新变量,其中每个唯一 ID 的值为 1(如果该唯一 ID 在任何季度进行了联系)。

谢谢。

一个选项是按 '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)))

我们可以 sum contact 信息并找出值大于 0 的 uniq_ID

library(dplyr)

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

在 base R 中将使用 ave

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

如果我们有更多的年份,想对每一年的每个ID做,我们可以提取年份信息

library(dplyr)
library(lubridate)

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

这为您提供与原始 pop_df 相同的行数,每个 uniq_ID 重复 contact_year 信息。您还可以考虑在 dplyr 中使用 summarise 并在基数 R 中使用 aggregate,这样每个 ID 只给您一行。