如果条件发生在其中一个人中,则识别个人群体

Identifying groups of individuals if conditional occurence in one of them

我正在尝试从数据库中识别(使用二进制 1/0 变量)受试者组,只要该组中至少有一个受试者满足两个条件。

我的数据库 DF 由描述每个成员性别和年龄的家庭组成(以及家庭 ID family):我想创建一个新的二进制变量 NoMan 如果一个家庭(sx 具有 1 属性)中至少有一名男性 年龄超过 16 岁,则该值为 0,否则需要值 1。请注意,我希望 NoMan 对同一家庭的所有成员都相同。

family <- factor(rep(c("001","002","003"), c(10,8,15)),
                 levels=c("001","002","003"), labels=c("001","002","003"), ordered=TRUE)
ag <- c(22,8,4,2,55,9,44,65,1,7,32,2,2,1,6,9,18,99,73,1,2,3,4,5,6,7,8,9,10,18,11,22,33)
sx <- c(1,2,2,2,1,2,2,2,1,1,2,1,2,1,2,1,2,2,2,2,1,2,1,2,1,2,1,2,1,2,1,2,2)
DF <- data.frame(family, ag, sx)
DF

我尝试将 ddplyifelse 结合使用,但没有成功:

DF <- ddply(DF,.(family), transform, NoMan=ifelse(sx==1 & ag>16, 1, 0))
DF

似乎在最终的其他限制中,在此脚本中,函数适用于个人而不是家庭(实际上我希望他们将相同的结果应用于同一家庭的所有成员)。

我觉得我的方向是正确的,但也许有人对这个问题有好的解决方案?

PS:刚刚编辑了 DF 因为在这个例子中我希望所有来自家庭 003 的成员都被标记为 NoMan==1

ifelse returns 结果向量忽略组,您可以使用 any 聚合每个组的结果:

library(plyr)
ddply(DF, .(family), transform, NoMan = +any(sx == 1 & ag < 16))

我们可以使用dplyr

library(dplyr)
DF %>%
   group_by(family) %>% 
   mutate(NoMan = as.integer(any(sx == 1 & ag < 16)))

或使用 base R

中的 ave
DF$NoMan <- with(DF, as.integer(ave(sx==1 & ag < 16, family, FUN = any)))
    DF$NoMan = c(! DF$family %in% unique(DF[DF$sx == 1 & DF$ag < 16,1]))
#Obtain unique families
family = c(unique(as.character(DF$family)))
NoMan  = c()

for (i in 1:length(family)){
#Subset a new dataframe for each family with only male members and check if minimun age is below 16
if (min(subset(DF,DF$family == family[1] & DF$sx=="1")$ag) < 16){
NoMan[i] = 1
} else {
NoMan[i] = 0
}
}

#Join unique family and NoMan into new dataframe
DF2 = cbind(family,NoMan)

#Use lookup command of qdapTools package
library(qdapTools)
DF$NoMan = lookup(DF$family,DF2)