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

时间:2017-01-04 09:42:41

标签: r dataframe transform plyr

我回到之前的一个问题/帖子,我得到了很好的建议,但还需要额外的推动:我们的想法是创建一个二元变量,它在条件上取决于任何相关家庭成员的个人状态。该值由同一系列的所有成员共享。我再次举一个重复的例子:

      family <- factor(rep(c("001","002","003"), c(10,8,15)),levels=c("001","002","003"), labels=c("001","002","003"), ordered=TRUE)
      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)
      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)
      st <- factor(rep(c("a","b","c"),11))
      DF <- data.frame(family, ag,sx,st)  ; DF

@Psidom提出的一个很好的技巧允许我创建这个新的变量NoMan,为一个不包括任何16岁以上的人的家庭中的所有个体取值1

      DF <- ddply(DF, .(family), transform, NoMan = +!any(sx == 1 & ag > 16)) ; DF ## works well !!

我现在正在尝试添加与年龄相关的另一个条件:NoMan也等于1,只要年龄超过16岁的男性家庭成员都有&#34; a&#34;或&#34; b&#34;作为因子st的属性。我尝试了以下但这不起作用:

      DF <- ddply(DF, .(family), transform, NoMan = !any(sx == 1 & ag > 16) |
                                            all(sx == 1 & ag > 16 & st=="a") |
                                            all(sx == 1 & ag > 16 & st=="b")) ; DF 

关于家庭001没有将值1视为NoMan的原因的任何线索?谢谢......

1 个答案:

答案 0 :(得分:1)

与以下内容比较:

DF <- ddply(DF, .(family), transform, NoMan = +!any((sx == 1 & ag > 16) & 
    ((sx == 1 & ag > 16 & st != "a") & (sx == 1 & ag > 16 & st != "b"))))

或使用简化的

 DF <- ddply(DF, .(family), transform, NoMan = +!any(sx == 1 & ag > 16 
                                           & (st != "a" & st != "b")))