通过直接引用组放弃group_by之后的最后一个或第一个组

时间:2017-07-18 16:26:52

标签: r group-by

数据:

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 个答案:

答案 0 :(得分:1)

也许这有帮助

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][]

答案 1 :(得分:1)

我假设你不应该假设我们事先知道团体的数量。尝试使用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来查看&#34; grouped_df&#34;的实际内容:

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"))

请注意,标签是data.frame,因此您可以进一步将unlist应用于all_but_last的结果,然后您无需使用"[["提取其值