r中的rle函数用于组

时间:2018-04-23 14:23:37

标签: r

以下是我的数据的样子。

City, count
Mexico, 1
Mexico, 1
London, 0
London, 1
London, 1

我正在使用Rle函数在我的值中统一计数,但无法应用组逻辑。

我尝试了循环功能,但它没有用。

我正在寻找下面的输出

Mexico, 1:2
London, 0:1
London, 1:2

5 个答案:

答案 0 :(得分:5)

Matrix::Matrix(int nrows, int ncols): { Matrix_= vector<vector<double>>(nrows, vector<double>(ncols, 0.)); nc_ = ncols; nr_ = nrows; } 是一种将运行ID变量添加到分组的快速方法,在此之后聚合是典型的。如果您愿意,可以将它借用于dplyr上下文​​:

data.table::rleid

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

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

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

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

或基础R:

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

答案 1 :(得分:2)

这是一个使用dplyr的解决方案。我使用count来计算每个城市数字组合的实例。然后,我用冒号分隔符将数字和数字粘在一起。

library(dplyr)

df <- data.frame(city = c("Mexico", "Mexico", "London", "London", "London"),
                 nums = c(1, 1, 0, 1, 1))

df %>% 
  count(city, nums) %>% 
  mutate(stuff = paste(nums, n, sep = ":")) %>% 
  select(city, stuff)

# # A tibble: 3 x 2
#   city   stuff
#   <fct>  <chr>
# 1 London 0:1  
# 2 London 1:2  
# 3 Mexico 1:2  

答案 2 :(得分:2)

尝试aggregate:我们将n定义为count的同义词,以便它不会在双方都与之混淆:

aggregate(count ~ City + n, transform(DF, n = count), 
   function(x) paste0(x[1], ":", length(x)))

,并提供:

    City n count
1 London 0   0:1
2 London 1   1:2
3 Mexico 1   1:2

注意

Lines <- "City, count
Mexico, 1
Mexico, 1
London, 0
London, 1
London, 1"
DF <- read.csv(text = Lines, as.is = TRUE)

答案 3 :(得分:2)

df <- data.frame(city = c("Mexico", "Mexico", "London", "London", "London"),
                 count = c(1, 1, 0, 1, 1))

r <- rle(df$count)
df <- df[!duplicated(df), ] 
df$count <- paste0(r$values, ":", r$lengths)

    city count
1 Mexico   1:2
3 London   0:1
4 London   1:2

答案 4 :(得分:1)

试试这个解决方案:

使用rle

定义一个函数
f<-function(x,df)
 {
   var<-rle(df[df$City==x,"count"])
   out<-data.frame(x,cbind(paste(var$values,var$lengths,sep=":")))
   return(out)
 }

使用lapply

将其应用于每个城市值
library("dplyr")
df_out<-suppressWarnings(bind_rows(lapply(as.character(unique(df$City)),f,df=df)))
colnames(df_out)<-c("City","count")

您想要的输出:

df_out
    City count
1 Mexico   1:2
2 London   0:1
3 London   1:2