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

时间:2016-12-27 16:43:00

标签: r conditional plyr

我试图从数据库中识别(使用二进制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

4 个答案:

答案 0 :(得分:1)

ifelse会返回结果向量而忽略该组,您可以使用any汇总每个组的结果:

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

答案 1 :(得分:1)

我们可以使用dplyr

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

或使用ave

中的base R
DF$NoMan <- with(DF, as.integer(ave(sx==1 & ag < 16, family, FUN = any)))

答案 2 :(得分:1)

    DF$NoMan = c(! DF$family %in% unique(DF[DF$sx == 1 & DF$ag < 16,1]))

答案 3 :(得分: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)