我是 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,您可以检测序列并使用 cumsum
和 head
创建分组变量:
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/