我试图从数据库中识别(使用二进制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
我尝试将ddply
与ifelse
结合使用,但这并不成功:
DF <- ddply(DF,.(family), transform, NoMan=ifelse(sx==1 & ag>16, 1, 0))
DF
似乎在最终的其他限制中,在这个脚本中,函数适用于个人而不是家庭(我实际上希望他们将相同的结果应用于同一家族的所有成员)。
我觉得我在正确的轨道上,但也许有人能很好地解决这个问题?
PS:刚刚编辑过DF
,因为在此示例中,我希望003系列中的所有成员都被标记为NoMan==1
答案 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)