代码之家  ›  专栏  ›  技术社区  ›  JontroPothon

跨逻辑值按组聚合

  •  2
  • JontroPothon  · 技术社区  · 1 年前

    我有这个数据帧:

    dataf <- tibble(A = sample(c(TRUE, FALSE), 10, replace = T), 
    +                B = sample(c(TRUE, FALSE), 10, replace = T), 
    +                C = sample(c(TRUE, FALSE), 10, replace = T), 
    +                group = c(rep("grp1", 3), rep("grp2", 3), rep("grp3", 4)))
    
    > dataf
    # A tibble: 10 × 4
       A     B     C     group
       <lgl> <lgl> <lgl> <chr>
     1 TRUE  TRUE  TRUE  grp1 
     2 FALSE TRUE  TRUE  grp1 
     3 TRUE  TRUE  TRUE  grp1 
     4 TRUE  TRUE  TRUE  grp2 
     5 FALSE TRUE  TRUE  grp2 
     6 TRUE  FALSE TRUE  grp2 
     7 TRUE  FALSE FALSE grp3 
     8 TRUE  FALSE TRUE  grp3 
     9 FALSE FALSE TRUE  grp3 
    10 FALSE FALSE  FALSE grp3 
    

    我想按变量组聚合行。如果列中存在 TRUE 真的 会在那里,否则 FALSE .例如in grp1 A列有 真的 , 错误的 真的 .因为它有一个 真的 ,骨料应为 真的 对于 grp1 A 同样地, grp3 ,B栏应 错误的 因为它没有 真的 在里面。

    生成的数据帧应该如下所示:

     A     B     C     groupp
      <lgl> <lgl> <lgl> <chr> 
    1 TRUE  TRUE  TRUE  grp1  
    2 TRUE  TRUE  TRUE grp2  
    3 TRUE  FALSE  TRUE  grp3
    

    你知道如何实现这一点吗?

    2 回复  |  直到 1 年前
        1
  •  2
  •   G. Grothendieck    1 年前

    1) dplyr 在最终使用时使用注释中的输入 across 具有 any .最后移动 group 列将成为最后一列。

    library(dplyr)
    
    dataf %>%
      summarize(across(where(is.logical), any), .by = group) %>%
      relocate(group, .after = last_col())
    

         A     B    C group
    1 TRUE  TRUE TRUE  grp1
    2 TRUE  TRUE TRUE  grp2
    3 TRUE FALSE TRUE  grp3
    

    2) 基地R 或者仅使用碱基R:

    aggregate(. ~ group, dataf, any)[c(2:4, 1)]
    

    A、B、C组
    1真真真真grp1
    2真真真真grp2
    3真假真grp3
    

    注:

    问题中代码产生的数据f是不可复制的,因为它使用的是随机数,没有 set.seed(...) 因此,我们采用了以下方法。

    Lines <- " A     B     C     group
     1 TRUE  TRUE  TRUE  grp1 
     2 FALSE TRUE  TRUE  grp1 
     3 TRUE  TRUE  TRUE  grp1 
     4 TRUE  TRUE  TRUE  grp2 
     5 FALSE TRUE  TRUE  grp2 
     6 TRUE  FALSE TRUE  grp2 
     7 TRUE  FALSE FALSE grp3 
     8 TRUE  FALSE TRUE  grp3 
     9 FALSE FALSE TRUE  grp3 
    10 FALSE FALSE  FALSE grp3 "
    dataf <- read.table(text = Lines)
    
        2
  •  0
  •   ThomasIsCoding    1 年前

    您可以使用 reframe

    dataf %>%
      reframe(across(everything(), any), .by = group) %>%
      `[`(names(dataf))
    

    这给了

         A     B    C group
    1 TRUE  TRUE TRUE  grp1
    2 TRUE  TRUE TRUE  grp2
    3 TRUE FALSE TRUE  grp3
    
    推荐文章