我试图从数据库中识别(使用二进制1/0变量)主题组,只要该组中至少有一个主题满足两个条件。
我的数据库DF
是由描述每个成员的性别和年龄的家庭(以及家庭ID family
)组成的:我想创建一个新的二进制变量NoMan
,如果一个家庭中至少有一个男性(具有属性1
的sx
)是 age 而不是16y,则该变量为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
发布于 2016-12-27 16:59:55
DF$NoMan = c(! DF$family %in% unique(DF[DF$sx == 1 & DF$ag < 16,1]))
发布于 2016-12-27 16:50:27
ifelse
返回一个结果向量,忽略组,您可以使用any
来聚合每个组的结果:
library(plyr)
ddply(DF, .(family), transform, NoMan = +any(sx == 1 & ag < 16))
发布于 2016-12-27 16:51:50
我们可以使用dplyr
library(dplyr)
DF %>%
group_by(family) %>%
mutate(NoMan = as.integer(any(sx == 1 & ag < 16)))
或者使用来自base R
的base R
DF$NoMan <- with(DF, as.integer(ave(sx==1 & ag < 16, family, FUN = any)))
https://stackoverflow.com/questions/41348897
复制相似问题