給定一個分組tbl,我可以提取一個/幾個組嗎?原型時代碼,例如:如何提取dplyr中的一個特定組
mtcars %>%
group_by(cyl) %>%
select_first_n_groups(2) %>%
do({'complicated expression'})
當然,可以分組之前做一個顯式濾波器 這種功能可以是有用的,但是這可能是麻煩的。
給定一個分組tbl,我可以提取一個/幾個組嗎?原型時代碼,例如:如何提取dplyr中的一個特定組
mtcars %>%
group_by(cyl) %>%
select_first_n_groups(2) %>%
do({'complicated expression'})
當然,可以分組之前做一個顯式濾波器 這種功能可以是有用的,但是這可能是麻煩的。
試試這個在哪裏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
。
謝謝。這適用於以下警告。首先,僅支持'data.frame'後端。其次,使用'data [...]'再次分組。但是,由於用例表明選擇了少數組,所以這不應該成爲問題。我會接受答案,因爲看起來'dplyr'沒有這樣的內置功能。 – 2014-10-24 08:20:48
@Grothendieck您的解決方案今天有效嗎?在'dplyr'中有沒有直接做到這一點的東西? – 2017-01-11 14:00:20
當我將答案中的代碼粘貼到R時,它似乎與dplyr 0.5(CRAN上的最新版本)一起工作。它按照預期給出了cyl = 4或= 6(前兩個組)的行。如果它不適合你,那麼在重新啓動R從香草狀態後再試一次。 – 2017-01-11 14:39:22
與一些嵌套沿位的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)
http://stackoverflow.com/questions/22182442/dplyr-how-to-apply-do-on-result-of-作品,未經輔助函數group-by – KFB 2014-10-22 08:58:15
在data.table中,你可以使用'setDT(mtcars)[,.SD [.GRP%in%1:2],by = cyl]' – akrun 2014-10-22 09:02:25
@akrun用這種方法,我似乎得到正確結果與警告消息。%mtcars%> mutate(cyl = as.factor(cyl))%>%group_by(cyl)%>%filter(cyl == levels(cyl)[c(1,3)]) 「我對此感到好笑。但是,有什麼想法? – jazzurro 2014-10-22 09:13:36