确定数据框中的个人是否在 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
只给您一行。
我有这样的数据
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
只给您一行。