我有一个data.frame,其中有一列整数值。我需要形成一个分组变量,以标识该列中的序列中断。例如,我可以创建另一列升序整数,每当原始列的值不大于其滞后值时就添加一个。我该怎么做呢?
例如,如果我有一个像这样的data.frame:
df <- data.frame(A = c(1,2,4,6,78,3,56,78,23))
Run Code Online (Sandbox Code Playgroud)
我需要一些方法来产生带有列B的新表:
df$B <- c(1,1,1,1,1,2,2,2,3)
Run Code Online (Sandbox Code Playgroud)
我尝试过例如dplyr
:
df %>% mutate(B = 1,
B = case_when(A < lag(A), B + 1))
Run Code Online (Sandbox Code Playgroud)
那不是很正确。
我们可以使用cumsum
和diff
,每次序列被破坏时,它将增加值
cumsum(c(-1, diff(df$A)) < 0)
#[1] 1 1 1 1 1 2 2 2 3
Run Code Online (Sandbox Code Playgroud)
我们还可以集成到dplyr
链中
library(dplyr)
df %>%
mutate(B = cumsum(c(-1, diff(A)) < 0))
# A B
#1 1 1
#2 2 1
#3 4 1
#4 6 1
#5 78 1
#6 3 2
#7 56 2
#8 78 2
#9 23 3
Run Code Online (Sandbox Code Playgroud)
一种lag
可能的使用方式是
df %>%
mutate(B = cumsum(c(-1, (A - lag(A))[-1]) < 0))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53 次 |
最近记录: |