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

通过直接引用组来丢弃group_之后的最后一个或第一个组

  •  0
  • CPak  · 技术社区  · 8 年前

    数据:

    df <- data.frame(A=c(rep(letters[1],3),rep(letters[2],3),rep(letters[3],3)),
                     B=rnorm(9),
                     stringsAsFactors=F)
    

    我不知道有没有办法 通过直接引用组 之后 group_by(A) 要获得所需的输出:

      A          B
    1 a -0.4900863
    2 a  1.4106594
    3 a -0.2245738
    4 b -0.2124955
    5 b  0.6963785
    6 b  0.9151825
    

    例如,类似于:

    df %>% group_by(A) %>% head(.Groups,-1)
    or
    df %>% group_by(A) %>% Groups[1:2]
    

    我对以下几种解决方案不感兴趣

    df %>% filter(!(A == max(A)))
    df %>% filter(!(A %in% max(A)))
    

    或其他不需要 group_by

    2 回复  |  直到 8 年前
        1
  •  1
  •   IRTFM    8 年前

    我假设你不应该假设我们事先知道团队的数量。尝试使用 labels

     all_but_last <- df %>% group_by(A) %>% attr("labels") %>% head(-1)
      A
    1 a
    2 b
    

    …提取所需行

     > df %>% filter(A %in% all_but_last[[1]])
      A            B
    1 a -0.799026840
    2 a -0.712402478
    3 a  0.685320094
    4 b  0.971492883
    5 b -0.001479117
    6 b -0.817766296
    

    有助于使用 dput 查看“grouped_df”的实际内容:

    dput( df %>% group_by(A) )
    structure(list(A = c("a", "a", "a", "b", "b", "b", "c", "c", 
    "c"), B = c(-0.799026840397576, -0.712402478350695, 0.685320094252465, 
    0.971492883452258, -0.00147911717469651, -0.817766295631676, 
    -1.00112471676908, 1.88145909873596, -0.305560178617216)), .Names = c("A", 
    "B"), row.names = c(NA, -9L), class = c("grouped_df", "tbl_df", 
    "tbl", "data.frame"), vars = "A", drop = TRUE, indices = list(
        0:2, 3:5, 6:8), group_sizes = c(3L, 3L, 3L), biggest_group_size = 3L, 
     labels = structure(list(
                           A = c("a", "b", "c")), 
                           row.names = c(NA, -3L), 
                           class = "data.frame", 
                           vars = "A", drop = TRUE, .Names = "A"))
    

    请注意,标签是数据。框架,以便您可以进一步应用 unlist 结果变成了 all_but_last 然后你就不需要用 "[["

        2
  •  1
  •   akrun    8 年前

    library(dplyr)
    df %>%
      group_by(A) %>% 
      group_indices(.) %in% 1:2 %>%
      df[.,] 
    

    或与 data.table

    library(data.table)
    setDT(df)[,  grp := .GRP, A][grp %in% unique(grp)[1:2]][, grp := NULL][]