r中的rle函数用于组

Jay*_*Jay 3 r

以下是我的数据的样子.

City, count
Mexico, 1
Mexico, 1
London, 0
London, 1
London, 1
Run Code Online (Sandbox Code Playgroud)

我正在使用Rle函数来计算我的值中的一致性,但无法应用组逻辑.

我试过循环功能,但它没有用.

我正在寻找下面的输出

Mexico, 1:2
London, 0:1
London, 1:2
Run Code Online (Sandbox Code Playgroud)

ali*_*ire 5

data.table::rleid是一种将运行ID变量添加到分组依据的快速方法,在此之后聚合是典型的.如果您愿意,可以将其借用于dplyr上下文​​:

library(dplyr)

df <- data_frame(City = c("Mexico", "Mexico", "London", "London", "London"), 
                 count = c(1L, 1L, 0L, 1L, 1L))

df %>% 
    group_by(run = data.table::rleid(City, count), City) %>% 
    summarise(count = paste(count[1], n(), sep = ':'))
#> # A tibble: 3 x 3
#> # Groups:   run [?]
#>     run City   count
#>   <int> <chr>  <chr>
#> 1     1 Mexico 1:2  
#> 2     2 London 0:1  
#> 3     3 London 1:2
Run Code Online (Sandbox Code Playgroud)

但是这些数据还不足以区分普通分组和运行分组.重新取样以使其成为更具代表性的数据集,

set.seed(47)    # for reproducibility
df2 <- df %>% slice(sample(nrow(.), 10, replace = TRUE))

df2 %>% 
    group_by(run = data.table::rleid(City, count), City) %>% 
    summarise(count = paste(count[1], n(), sep = ':'))
#> # A tibble: 8 x 3
#> # Groups:   run [?]
#>     run City   count
#>   <int> <chr>  <chr>
#> 1     1 London 1:1  
#> 2     2 Mexico 1:1  
#> 3     3 London 1:2  
#> 4     4 London 0:1  
#> 5     5 London 1:1  
#> 6     6 Mexico 1:1  
#> 7     7 London 0:2  
#> 8     8 London 1:1
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以在data.table中使用相同的逻辑:

library(data.table)

setDT(df2)[, 
           .(count = paste(count[1], .N, sep = ':')), 
           by = .(run = rleid(City, count), City)]
#>    run   City count
#> 1:   1 London   1:1
#> 2:   2 Mexico   1:1
#> 3:   3 London   1:2
#> 4:   4 London   0:1
#> 5:   5 London   1:1
#> 6:   6 Mexico   1:1
#> 7:   7 London   0:2
#> 8:   8 London   1:1
Run Code Online (Sandbox Code Playgroud)

或基数R:

df2$run <- data.table::rleid(df2$City, df2$count)

aggregate(count ~ City + run, df2, function(x) paste(x[1], length(x), sep = ':'))
#>     City run count
#> 1 London   1   1:1
#> 2 Mexico   2   1:1
#> 3 London   3   1:2
#> 4 London   4   0:1
#> 5 London   5   1:1
#> 6 Mexico   6   1:1
#> 7 London   7   0:2
#> 8 London   8   1:1
Run Code Online (Sandbox Code Playgroud)