2017-07-18 28 views
0

數據:放棄最後一個或第一組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 

我感興趣的解決方案,工作直接AT THE GR OUPS LEVEL

舉例來說,像這樣:

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

我沒興趣SOLUTIONS

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

或其他溶液不需要group_by工作的以下幾種

+0

你需要%1%2%>%df [。,]' – akrun

+0

%d%> group_by(A)%>%group_indices(。)%這有點像'df%>%filter(! (A == max(A))'',但如果我在接下來的24小時內沒有收到更好的答案,我會請您發帖作爲答案......謝謝! – CPak

回答

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看一個 「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")) 

請注意,標籤是一個data.frame,因此您可以進一步將unlist應用於成爲all_but_last的結果,然後您將n它需要提取其值"[["

+0

看着dput確實有幫助。謝謝。在接受答案之前,我會稍微等一下。欣賞它。 – CPak

+1

無需等待。您可以隨時更改。 –

+1

這有點像派發禮物並立即將它們帶走。 ;-) – CPak

1

也許這個h ELPS

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][] 
相關問題