首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果有条件地发生在其中一个群体中的个体群的识别

如果有条件地发生在其中一个群体中的个体群的识别
EN

Stack Overflow用户
提问于 2016-12-27 16:43:00
回答 4查看 56关注 0票数 0

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

我的数据库DF是由描述每个成员的性别和年龄的家庭(以及家庭ID family)组成的:我想创建一个新的二进制变量NoMan,如果一个家庭中至少有一个男性(具有属性1sx)是 age 而不是16y,则该变量为0。否则,它的值为1。请注意,对于来自同一个家庭的所有成员,NoMan都是相同的。

代码语言:javascript
运行
复制
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结合使用,但这并不成功:

代码语言:javascript
运行
复制
DF <- ddply(DF,.(family), transform, NoMan=ifelse(sx==1 & ag>16, 1, 0))
DF

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

我觉得我在正确的轨道上,但也许有人能很好地解决这个问题?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-27 16:59:55

代码语言:javascript
运行
复制
    DF$NoMan = c(! DF$family %in% unique(DF[DF$sx == 1 & DF$ag < 16,1]))
票数 1
EN

Stack Overflow用户

发布于 2016-12-27 16:50:27

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

代码语言:javascript
运行
复制
library(plyr)
ddply(DF, .(family), transform, NoMan = +any(sx == 1 & ag < 16))
票数 1
EN

Stack Overflow用户

发布于 2016-12-27 16:51:50

我们可以使用dplyr

代码语言:javascript
运行
复制
library(dplyr)
DF %>%
   group_by(family) %>% 
   mutate(NoMan = as.integer(any(sx == 1 & ag < 16)))

或者使用来自base Rbase R

代码语言:javascript
运行
复制
DF$NoMan <- with(DF, as.integer(ave(sx==1 & ag < 16, family, FUN = any)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41348897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档