计算数字序列的长度

包含一些算术序列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,然后再进行第二行以及仅增加计数,或者重置为1df $ 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Python中的while循环计算数字序列

来自分类Dev

计算数字序列,同时跳过缺失值

来自分类Dev

如何计算数字

来自分类Dev

如何只计算数字长度的正则表达式

来自分类Dev

TCL计算数字的长度并在文本文件中正确设置格式

来自分类Dev

PHP:如何计算数字?

来自分类Dev

计算数字出现的次数

来自分类Dev

计算数字出现的次数

来自分类Dev

计算数组中的数字

来自分类Dev

如何计算数字位数?

来自分类Dev

使用for循环R计算数据帧列中的数字序列

来自分类Dev

计算最大序列长度

来自分类Dev

计算数据帧中行的长度

来自分类Dev

计算数字与静态数字之差的公式

来自分类Dev

如何从循环中计算数字?

来自分类Dev

在JAVA中计算数字的相对素数?

来自分类Dev

在R中解析和计算数字

来自分类Dev

如何计算数字数组的EMA?

来自分类Dev

Python计算数字之间的合计出现

来自分类Dev

用Java计算数字的除数

来自分类Dev

如何从循环中计算数字?

来自分类Dev

计算数组中“每个”数字的出现

来自分类Dev

根据用户输入计算数字

来自分类Dev

C ++计算数字的素数并打印

来自分类Dev

如何计算数字或字符匹配的模式?

来自分类Dev

从.net框架之外计算数字滴答

来自分类Dev

从动态字段计算数字

来自分类Dev

如何计算数字x的频率

来自分类Dev

在这种情况下如何计算数组的长度