簡體   English   中英

使用 R 形成組的最有效方式

[英]The Most Efficient Way of Forming Groups using R

我有一個 tibble dt ,如下所示:

library(tidyverse) 

dt <- tibble(x=as.integer(c(0,0,1,0,0,0,1,1,0,1))) %>% 
  mutate(grp = as.factor(c(rep("A",3), rep("B",4), rep("C",1), rep("D",2))))
dt

在此處輸入圖像描述

可以觀察到分組規則是:

  1. 從 0 開始並以 1 結束(例如,A、B、D 組)或
  2. 它僅包含 1 個(例如,C 組)

問題:給定一個列integer向量 x 的 0 和 1 以 0 開頭並以 1 結尾的小標題,使用 R 獲得分組的最有效方法是什么? (您可以使用任何分組符號/因素。)

我們可以獲得“x”的累積總和(假設它是二進制的),將lag加 1 並使用該索引將其替換為LETTERS (注意, LETTERS僅用作與預期 output 匹配的一部分 - 它可以采取go 達到一定限度)

library(dplyr)
dt %>% 
   mutate(grp2 = LETTERS[lag(cumsum(x), default = 0)+ 1])

-輸出

# A tibble: 10 x 3
       x grp   grp2 
   <int> <fct> <chr>
 1     0 A     A    
 2     0 A     A    
 3     1 A     A    
 4     0 B     B    
 5     0 B     B    
 6     0 B     B    
 7     1 B     B    
 8     1 C     C    
 9     0 D     D    
10     1 D     D    

雖然 Akrun 提出的策略很棒,但也表明它可以通過accumulate來管理

library(tidyverse) 

dt <- tibble(x=as.integer(c(0,0,1,0,0,0,1,1,0,1))) %>% 
  mutate(grp = as.factor(c(rep("A",3), rep("B",4), rep("C",1), rep("D",2))))

dt %>%
  mutate(GRP = accumulate(lag(x, default = 0),.init =1, ~ if(.y != 1) .x  else .x+1)[-1])
#> # A tibble: 10 x 3
#>        x grp     GRP
#>    <int> <fct> <dbl>
#>  1     0 A         1
#>  2     0 A         1
#>  3     1 A         1
#>  4     0 B         2
#>  5     0 B         2
#>  6     0 B         2
#>  7     1 B         2
#>  8     1 C         3
#>  9     0 D         4
#> 10     1 D         4

代表 package (v2.0.0) 於 2021 年 6 月 13 日創建

暫無
暫無

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

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