r - 连续分类数据序列

标签 r

我是 R 的新手,对向表中添加新变量有疑问。我的数据序列以 10 开头,以 20 结尾,出现了好几次。

有没有办法将这些序列连续分组?

例子:

列中的数据看起来像这样

10 3 15 15 19 19 20 20 10 10 11 17 20  ...

我想要这样的输出

10 group 1
3  group 1
15 group 1
15 group 1
19 group 1
19 group 1
20 group 1
20 group 1
10 group 2
10 group 2
11 group 2
17 group 2
20 group 2
...

是否可以编写类似的程序?

非常感谢您的帮助!

最佳答案

使用基础 R,您可以检测序列并使用 cumsumhead 创建分组变量:

df$grp <- cumsum(df$x == 10 & c(20, head(df$x, -1)) == 20)

给出:

> df
     x grp
 1: 10   1
 2:  3   1
 3: 15   1
 4: 15   1
 5: 19   1
 6: 19   1
 7: 20   1
 8: 20   1
 9: 10   2
10: 10   2
11: 11   2
12: 17   2
13: 20   2

这是做什么的:

  • df$x == 10 检测到 10
  • c(20, head(df$x, -1)) == 20检测前一个值是否等于20,第一个值设置为20 因为 df$x
  • 的第一个值有前面的值
  • 通过将这两个与 & 组合,您将获得一个逻辑值,指示 df$ 中的哪些值等于 10 以及前面的哪些值值也等于 20
  • 将其包装在 cumsum 中,您将获得一个分组值。

或者使用data.table:

library(data.table)
setDT(df)[, grp := cumsum(x == 10 & c(0, head(x, -1)) == 20)][]

或者使用dplyr:

library(dplyr)
df %>% 
  mutate(grp = cumsum(x == 10 & lag(x, default = 20) == 20))

您可以使用paste/paste0 将文本添加到组标签:

paste0('group_', cumsum(df$x == 10 & c(20, head(df$x, -1)) == 20))

使用的数据:

df <- data.frame(x = c(10, 3, 15, 15, 19, 19, 20, 20, 10, 10, 11, 17, 20))

关于r - 连续分类数据序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619834/

相关文章:

用平均值替换 R 中的缺失值

Rcpp - 在 sourceCpp 引用的文件中使用多个 C++ 函数?

r - 什么影响使用并行包创建集群的时间?

r - 确定指定长度的游程数

R - 自定义类列表的 'unlist' 方法

rgl plot3d 绘制点(球体),垂直线指向 x-y 平面

r - 如何为自定义 S3 类实现提取/子集化 ([, [<-, [[, [[<-) ] 函数?

r - ggplot fortify 忽略空间数据的顺序

r - 在 R 中将 .txt 更改为 .csv

r - 逐行计算列表列中的实例数