首页 > 解决方案 > 一致地按两列索引

问题描述

如何使用两列创建一致的列“id”?我需要分别通过'Date'和'Tr'获取索引列'id'。我有数据:

Date    Tr
1   20190829    1
2   20190829    1
3   20190829    1
4   20190829    1
5   20190829    2
6   20190829    2
7   20190830    2
8   20190830    2
9   20190830    2
10  20190830    2
11  20190830    1
12  20190830    1

示例数据:

data<-data.frame(Date=c(rep(20190829,6),rep(20190830,6)),Tr=c(rep(1,4),rep(2,6),rep(1,2)))

我正在尝试使用这样的东西:

data$id <- cumsum(c(TRUE, diff(data$Tr) != 0))

    Date    Tr  Id
1   20190829    1   1
2   20190829    1   1
3   20190829    1   1
4   20190829    1   1
5   20190829    2   2
6   20190829    2   2
7   20190830    2   2
8   20190830    2   2
9   20190830    2   2
10  20190830    2   2
11  20190830    1   3
12  20190830    1   3

但我需要一个结果:

data2<-data.frame(Date=c(rep(20190829,6),rep(20190830,6)),Tr=c(rep(1,4),rep(2,6),rep(1,2)),id=c(rep(1,4),rep(2,2),rep(3,4),rep(4,2)))

    Date    Tr  Id
1   20190829    1   1
2   20190829    1   1
3   20190829    1   1
4   20190829    1   1
5   20190829    2   2
6   20190829    2   2
7   20190830    2   3
8   20190830    2   3
9   20190830    2   3
10  20190830    2   3
11  20190830    1   4
12  20190830    1   4

我如何使用 R 来做到这一点?有没有可以快速产生结果的软件包?

标签: r

解决方案


data.table有一个方便的功能

library(data.table)
data$Id <- rleid(data$Date, data$Tr)

#        Date Tr Id
# 1  20190829  1  1
# 2  20190829  1  1
# 3  20190829  1  1
# 4  20190829  1  1
# 5  20190829  2  2
# 6  20190829  2  2
# 7  20190830  2  3
# 8  20190830  2  3
# 9  20190830  2  3
# 10 20190830  2  3
# 11 20190830  1  4
# 12 20190830  1  4

推荐阅读