[英]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
可以觀察到分組規則是:
問題:給定一個列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.