2017-06-20 70 views
1

假設我們有這樣的tibble:如何執行與那些R中連續元素GROUP_BY和dplyr

group item 
x  1 
x  2 
x  2 
y  3 
z  2 
x  2 
x  2 
z  1 

我想按組進行GROUP_BY。但是,我寧願只和相鄰的元素分組。例如,就我而言,我會有三個「x」組,並將「item」元素相加。其結果會是這樣的:

group item 
x 5 
y 3 
z 2 
x 4 
z 1 

我知道如何解決使用「的」循環這個問題。但是,這並不快,聽起來不直截了當。我寧願用簡單的邏輯來使用一些dplyr或tidyverse函數。

這個問題不重複。我知道在這裏有一個關於rle的問題,但是我的問題比這個更普遍。我要求一般解決方案。

回答

2

如果你想只使用基礎R + tidyverse,該代碼完全複製您的預期結果

mydf <- tibble(group = c("x", "x", "x", "y", "z", "x", "x", "z"), 
        item = c(1, 2, 2, 3, 2, 2, 2, 1)) 

mydf 

# A tibble: 8 × 2 
    group item 
    <chr> <dbl> 
1  x  1 
2  x  2 
3  x  2 
4  y  3 
5  z  2 
6  x  2 
7  x  2 
8  z  1 

runs <- rle(mydf$group) 

mydf %>% 
    mutate(run_id = rep(seq_along(runs$lengths), runs$lengths)) %>% 
    group_by(group, run_id) %>% 
    summarise(item = sum(item)) %>% 
    arrange(run_id) %>% 
    select(-run_id) 

Source: local data frame [5 x 2] 
Groups: group [3] 

    group item 
    <chr> <dbl> 
1  x  5 
2  y  3 
3  z  2 
4  x  4 
5  z  1 
1

您可以構建組標識符與rle,但更容易的途徑是隻使用data.table::rleid,這會爲你:

library(dplyr) 

df %>% 
    group_by(group, 
      group_run = data.table::rleid(group)) %>% 
    summarise_all(sum) 
#> # A tibble: 5 x 3 
#> # Groups: group [?] 
#> group group_run item 
#> <fctr>  <int> <int> 
#> 1  x   1  5 
#> 2  x   4  4 
#> 3  y   2  3 
#> 4  z   3  2 
#> 5  z   5  1