【问题标题】:Identifying groups of individuals if conditional occurence in one of them (next)如果其中一个有条件地出现,则识别个体群体(下一个)
【发布时间】:2017-05-18 13:19:09
【问题描述】:

我回到以前的问题/帖子,我得到了很好的建议,但需要额外的推动:这个想法是创建一个二进制变量,它根据任何相关家庭成员的个人状态有条件地取一个值。该值由同一家族的所有成员共享。我再举一个重复的例子:

      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 !!

我现在正在尝试添加另一个与年龄相关的条件:NoManalso 等于 1当任何 16 岁以上的男性家庭成员将“a”或“b”作为因素 @ 的属性时987654327@。我尝试了以下方法,但没有成功:

      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 的任何线索?谢谢...

【问题讨论】:

    标签: r dataframe transform plyr


    【解决方案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")))
    

    【讨论】:

    • 感谢您的回答,它似乎有效,但我不确定我是否理解它(我想):在您的第一个提议中,我更喜欢函数 +!any( 将首先识别没有任何人的家庭> 16 (sx == 1 &amp; ag &gt; 16)这很好,但是+!any( 也适用于第二个表达式不是吗?我希望它能够将价值 1 赋予所有没有任何 man>16 且 st=="a" st=="b" 的成员?
    • 谢谢@Darshan!我明白了,这不是一件容易的事!我可以通过使用稍微不同的DF 来检查这是否有效:family &lt;- factor(rep(c("001","002","003","004"), c(10,8,15,3)), levels=c("001","002","003","004"), labels=c("001","002","003","004"), ordered=TRUE) sx &lt;- c(2,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,2,1,1) ag &lt;- 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,19,5,19) st &lt;- factor(rep(c("a","b","c"),12)) DF &lt;- data.frame(family, ag,sx,st) ; DF
    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2022-11-06
    • 1970-01-01
    相关资源
    最近更新 更多