包含一些算术序列c(4,5,6)和c(10,11)的样本数据。
df <- data.frame(x = c(2, 4, 5, 6, 8, 10, 11))
我想要的是一个新列,它计算每个序列的长度,例如
> df
x cnt
1 2 1
2 4 1
3 5 2
4 6 3
5 8 1
6 10 1
7 11 2
首先分配df$cnt[1] = 1
,然后再进行第二行以及仅增加计数,或者重置为1
df $ x中的连续数字是否满足某些条件(此处x[i] - x[i-1] == 1
),将很简单。我只是不确定进入循环的方式R
-我也需要与团体打交道。
我可以创建新列以检查它是否在序列中。从那里,我可能可以rle
用来计算游程长度并生成cnt
列(不确定如何使用NA
)。
> df %>% mutate(check=(x-lag(x)==1))
x check
1 2 NA
2 4 FALSE
3 5 TRUE
4 6 TRUE
5 8 FALSE
6 10 FALSE
7 11 TRUE
这是要走的路吗?请使用dplyr
或建议解决方案data.table
。
dplyr。设置default
值,它将起作用:
df %>% mutate(check = x - lag(x, default = x[1L]) != 1) %>%
group_by(g = cumsum(check)) %>%
mutate(cnt = row_number()) %>%
ungroup %>% select(-g,-check)
x cnt
<dbl> <int>
1 2 1
2 4 1
3 5 2
4 6 3
5 8 1
6 10 1
7 11 2
数据表 同样,更简洁:
library(data.table)
setDT(df)
df[, cnt := 1:.N, by=cumsum(x != shift(x, fill=x[1L]) + 1L)]
x cnt
1: 2 1
2: 4 1
3: 5 2
4: 6 3
5: 8 1
6: 10 1
7: 11 2
shift
是data.table的类似物lag
。
或者,从软件包的v1.9.7开始,您可以改为使用rowid
:
df[, cnt := rowid(cumsum(x != shift(x, fill=x[1L]) + 1L))]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句