r - R中按组的代码序列:组内的重复值
问题描述
我想根据三列的组合编码一个数字序列:ID、年份和位置。我想将一个人在一个地方度过的年数作为一个序列来编号。序列应该在位置变化的那一年重新开始,所以即使一个人回到他们以前去过的地方,序列也应该重新开始。
带有序列的 df 应如下所示:
ID yr loc seq
1 1990 A 1
1 1991 A 2
1 1992 B 1
1 1993 B 2
1 1994 B 3
2 1990 B 1
2 1991 B 2
2 1992 A 1
2 1993 B 1
2 1994 B 2
3 1990 C 1
3 1991 C 2
3 1992 C 3
3 1993 B 1
3 1994 C 1
你知道如何在 R 中编写代码吗?
解决方案
在data.table
中,我们有rleid
使这里变得简单的函数。
library(data.table)
setDT(df)[, seq1 := seq_len(.N), .(ID, rleid(loc))]
df
# ID yr loc seq seq1
# 1: 1 1990 A 1 1
# 2: 1 1991 A 2 2
# 3: 1 1992 B 1 1
# 4: 1 1993 B 2 2
# 5: 1 1994 B 3 3
# 6: 2 1990 B 1 1
# 7: 2 1991 B 2 2
# 8: 2 1992 A 1 1
# 9: 2 1993 B 1 1
#10: 2 1994 B 2 2
#11: 3 1990 C 1 1
#12: 3 1991 C 2 2
#13: 3 1992 C 3 3
#14: 3 1993 B 1 1
#15: 3 1994 C 1 1
我们可以使用rleid
indplyr
和 base R 方法来获得预期的输出。
library(dplyr)
df %>%
group_by(ID, grp = data.table::rleid(loc)) %>%
mutate(seq1 = row_number())
或在基础 R 中:
df$seq1 <- with(df, ave(yr, ID, data.table::rleid(loc), FUN = seq_along))
@chinsoon12 建议的一个简洁选项是使用rowid
函数。
setDT(df)[, seq2 := rowid(ID, rleid(loc))]
数据
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L), yr = c(1990L, 1991L, 1992L, 1993L, 1994L,
1990L, 1991L, 1992L, 1993L, 1994L, 1990L, 1991L, 1992L, 1993L,
1994L), loc = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L,
2L, 3L, 3L, 3L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"),
seq = c(1L, 2L, 1L, 2L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 3L,
1L, 1L)), class = "data.frame", row.names = c(NA, -15L))
推荐阅读
- apache-spark - 使用 SparklyR 连接到 Spark 时出错
- regex - 如何使用正则表达式在回车和换行之前附加字符
- r - tidyverse 中是否有 R 函数可以使用代码选择列的元素?
- python - 如何使用 OpenCV 对 IP 摄像机进行身份验证
- angular - 如何构建我的 Angular 8 应用程序,以便在浏览器中打开 index.html 时它可以工作?
- c# - 在 Unity3D 中模拟真实的汽车旋转
- html - 在我的 CSS 中,网格属性无法正常运行
- sql-server - 推荐邮寄地址匹配方案?
- python - 如果两个字母变为0,如何从文件中的字符串中查找一个单词(Python 3)
- java - 无法加载驱动程序类 org.mariadb.jdbc.Driver