r - 如何根据另一列的模式创建组?

标签 r new-operator group

我有一个数据框如下,

dt <- data.frame(id = c("a","b","c","d","e","f","g","h","i","j"),
                 value = c(1,2,1,2,1,1,1,2,1,2))

> dt
   id value
1   a     1
2   b     2
3   c     1
4   d     2
5   e     1
6   f     1
7   g     1
8   h     2
9   i     1
10  j     2

我希望基于列value创建一个列,这样每当它在value列中遇到2时,它就会分配一个新的值组号。输出看起来像,

dtgroup <- data.frame(id = c("a","b","c","d","e","f","g","h","i","j"),
                      value = c(1,2,1,2,1,1,1,2,1,2),
                      group = c(1,1,2,2,3,3,3,3,4,4))

> dtgroup
   id value group
1   a     1     1
2   b     2     1
3   c     1     2
4   d     2     2
5   e     1     3
6   f     1     3
7   g     1     3
8   h     2     3
9   i     1     4
10  j     2     4

有什么想法吗?谢谢!

最佳答案

我们可以像下面一样使用findInterval

> transform(dt, group = 1 + findInterval(seq_along(value), which(value == 2), left.open = TRUE))
   id value group
1   a     1     1
2   b     2     1
3   c     1     2
4   d     2     2
5   e     1     3
6   f     1     3
7   g     1     3
8   h     2     3
9   i     1     4
10  j     2     4

剪切

> transform(dt, group = as.integer(cut(seq_along(value), c(-Inf, which(value == 2)))))
   id value group
1   a     1     1
2   b     2     1
3   c     1     2
4   d     2     2
5   e     1     3
6   f     1     3
7   g     1     3
8   h     2     3
9   i     1     4
10  j     2     4

关于r - 如何根据另一列的模式创建组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71410975/

相关文章:

按组多次重新排列列并将结果放入新列中

r - 根据 R 中的出生年份对人员进行分组

arrays - 如何在 MongoDB 聚合中合并来自多个文档的数组而不重复?

R:绘制 igraph 时选择性显示节点

r - 将数字数据变量更改为 R 中的日期格式以合并两个数据集

C++ 内存管理

javascript - 在 JavaScript 中,如何使用参数值数组构造对象,而不是列出它们?

r - 为什么 `print.function` 不同意用 `substitute()` 创建的函数体?

R 从网格数据中提取点的类别

c++ - "{}"中的 "new int[5]{};"的目的是什么?