如何指定和清理/删除行?

例如,这里是数据框。如果每个 ProjectNumber 中的年龄差小于 5,我想删除这些行。在 ProjectNumber = 1 内,年龄差为 6(56-50),因此保留 ProjectNumber 1 中的行。在 ProjectNumber2 中,年龄差为 2(37-35),因此将删除 ProjectNumber 2 中的 3 行。我怎样才能做到这一点?实际数据集中有数千个项目编号,因此无法真正手动完成。关键问题是如何指定这些行并删除它们。谢谢你。

项目编号 年龄
1 50
1 52
1 53
1 55
1 56
2 35
2 36
2 37
3 40
3 41
3 42
3 43
3 45
3 46

回答

基础 R 变体:

  1. aggregate然后merge。如果您有多个“密钥”(ProjectNumber此处),则此版本很好。

    keep <- subset(aggregate(Age ~ ProjectNumber, data = df1,
                             FUN = function(z) diff(range((z))) >= 5), Age)
    keep
    #   ProjectNumber  Age
    # 1             1 TRUE
    # 3             3 TRUE
    
    merge(df1, keep[,1,drop=FALSE], by = "ProjectNumber")
    #    ProjectNumber Age
    # 1              1  50
    # 2              1  52
    # 3              1  53
    # 4              1  55
    # 5              1  56
    # 9              3  40
    # 10             3  41
    # 11             3  42
    # 12             3  43
    # 13             3  45
    # 14             3  46
    
  2. aggregate然后%in%

    ### 'keep' from above
    subset(df1, ProjectNumber %in% keep$ProjectNumber)
    
  3. ave 然后是简单的子集:

    keep <- ave(df1$Age, df1$ProjectNumber, 
                FUN = function(z) diff(range(z)) >= 5) > 0
    keep
    #  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    df1[keep,]
    #    ProjectNumber Age
    # 1              1  50
    # 2              1  52
    # 3              1  53
    # 4              1  55
    # 5              1  56
    # 9              3  40
    # 10             3  41
    # 11             3  42
    # 12             3  43
    # 13             3  45
    # 14             3  46
    

以上是如何指定和清理/删除行?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>