簡體   English   中英

R - 根據特定組計算特定數字的連續出現次數

[英]R - Count consecutive occurrences of a specific number based on a specific group

在 R 中說我有 dataframe:

frame object  positive     
1     6       0    
2     6       1    
3     6       1    
4     6       1    
5     6       1      
6     6       0    
7     6       0    
8     6       1 
9     6       1   
10    6       1
1     7       1    
2     7       1   
3     7       1    
4     7       1   
5     7       1      
6     7       0    
7     7       1       
8     7       0    
9     7       1    
10    7       1

我正在嘗試創建一個新表,該表計算每個單獨的 object 的正列中值 1 的連續出現次數,並輸出最大和平均連續出現次數。 看起來像:

object  max  mean 
6       4    3.5
7       5    8/3

謝謝您的幫助

我創建了自己的數據,因此 output 不會完全是您顯示的。 盡管如此,它應該可以解決問題。

library(dplyr)
sat.seed(111)
df <- data.frame(frame=c(1:10,1:10),
                 object=rep(6:7, each=10),
                 positive=sample(0:1,20, replace=T))
df

   frame object positive
1      1      6        1
2      2      6        1
3      3      6        1
4      4      6        0
5      5      6        1
6      6      6        0
7      7      6        0
8      8      6        0
9      9      6        1
10    10      6        1
11     1      7        1
12     2      7        0
13     3      7        1
14     4      7        0
15     5      7        0
16     6      7        1
17     7      7        0
18     8      7        0
19     9      7        0
20    10      7        1    

df %>% group_by(object) %>%  summarise(mean=mean(rle(positive)$lengths[rle(positive)$values==1]) ,
    max=max(rle(positive)$lengths[rle(positive)$values==1]))

# A tibble: 2 × 3
  object  mean   max
   <int> <dbl> <int>
1      6     2     3
2      7     1     1

這是一個使用data.table::rleid來查找連續出現的 1 的解決方案。

library("tidyverse")

df <- tibble::tribble(
  ~frame, ~object, ~positive,
  1L, 6L, 0L,
  2L, 6L, 1L,
  3L, 6L, 1L,
  4L, 6L, 1L,
  5L, 6L, 1L,
  6L, 6L, 0L,
  7L, 6L, 0L,
  8L, 6L, 1L,
  9L, 6L, 1L,
  10L, 6L, 1L,
  1L, 7L, 1L,
  2L, 7L, 1L,
  3L, 7L, 1L,
  4L, 7L, 1L,
  5L, 7L, 1L,
  6L, 7L, 0L,
  7L, 7L, 1L,
  8L, 7L, 0L,
  9L, 7L, 1L,
  10L, 7L, 1L
)
df %>%
  group_by(object) %>%
  mutate(
    sequence = data.table::rleid(positive == 1),
  ) %>%
  filter(
    positive == 1
  ) %>%
  group_by(
    object, sequence
  ) %>%
  summarise(
    length = n()
  ) %>%
  summarise(
    max = max(length),
    mean = mean(length)
  )
#> `summarise()` has grouped output by 'object'. You can override using the
#> `.groups` argument.
#> # A tibble: 2 × 3
#>   object   max  mean
#>    <int> <int> <dbl>
#> 1      6     4  3.5 
#> 2      7     5  2.67

代表 package (v2.0.1) 於 2022 年 7 月 26 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM