2014-10-22 31 views
4

給定一個分組tbl,我可以提取一個/幾個組嗎?原型時代碼,例如:如何提取dplyr中的一個特定組

mtcars %>% 
    group_by(cyl) %>% 
    select_first_n_groups(2) %>% 
    do({'complicated expression'}) 

當然,可以分組之前做一個顯式濾波器 這種功能可以是有用的,但是這可能是麻煩的。

+0

http://stackoverflow.com/questions/22182442/dplyr-how-to-apply-do-on-result-of-作品,未經輔助函數group-by – KFB 2014-10-22 08:58:15

+2

在data.table中,你可以使用'setDT(mtcars)[,.SD [.GRP%in%1:2],by = cyl]' – akrun 2014-10-22 09:02:25

+0

@akrun用這種方法,我似乎得到正確結果與警告消息。%mtcars%> mutate(cyl = as.factor(cyl))%>%group_by(cyl)%>%filter(cyl == levels(cyl)[c(1,3)]) 「我對此感到好笑。但是,有什麼想法? – jazzurro 2014-10-22 09:13:36

回答

7

試試這個在哪裏groups是組號的向量。這裏1:2表示前兩組:

select_groups <- function(data, groups, ...) 
    data[sort(unlist(attr(data, "indices")[ groups ])) + 1, ] 

mtcars %>% group_by(cyl) %>% select_groups(1:2) 

選定的行按原始順序出現。如果您希望行按照指定組的順序出現(例如,在上面的eaxmple中,第一組的行之後是第二組的行),然後刪除sort

+0

謝謝。這適用於以下警告。首先,僅支持'data.frame'後端。其次,使用'data [...]'再次分組。但是,由於用例表明選擇了少數組,所以這不應該成爲問題。我會接受答案,因爲看起來'dplyr'沒有這樣的內置功能。 – 2014-10-24 08:20:48

+0

@Grothendieck您的解決方案今天有效嗎?在'dplyr'中有沒有直接做到這一點的東西? – 2017-01-11 14:00:20

+0

當我將答案中的代碼粘貼到R時,它似乎與dplyr 0.5(CRAN上的最新版本)一起工作。它按照預期給出了cyl = 4或= 6(前兩個組)的行。如果它不適合你,那麼在重新啓動R從香草狀態後再試一次。 – 2017-01-11 14:39:22

2

與一些嵌套沿位的dplyr/unnesting(由tidyr包支持),您可以建立一個小幫手,以獲得第一(或有)組

first = function(x) x %>% nest %>% slice(1) %>% unnest(data) 
mtcars %>% group_by(cyl) %>% first() 

通過調整切片你可以也可以按索引提取第n個或任何範圍的組,但通常第一個或最後一個是大多數用戶想要的。

該名稱受功能API的啓發,所有功能API都稱爲first(請參閱kotlin,python,scala,java,spark的stdlibs)。

爲了確保它也通過直接運行

mtcars %>% group_by(cyl) %>% nest %>% slice(1) %>% unnest(data)