关于dplyr:如何在R中对交集/ group_indices的结果重新编号?

How to renumber result of intersection/group_indices in R?

我在R中的交集/ group_indices的重新编号结果中苦苦挣扎了几天。示例数据帧如下所示:

1
2
3
4
5
6
t <- data.frame(mid=c(102,102,102,102,102,102,102,103,103,103,103,103,103,103),
                    aid=c(10201,10202,10203,10204,10205,10206,10207,
                          10301,10302,10303,10304,10305,10306,10307),
                    dummy=c(0,1,0,1,0,1,0,0,1,0,1,0,1,0),
                    location=c(0,2,0,4,0,1,0,0,2,0,2,0,3,0)
                    )

我需要通过一组"中间"将存储在"位置"字段中的数字更新为连续数字,而无需更改"援助"定义的顺序。"中"是个人(人)的标识符,"援助"代表他们一天中的顺序活动日志。
"位置"标识每个"中间"访问的位置的唯一ID。因此,第9行的位置" 2"和第11行的位置" 2"在mid = 102时位于同一位置;但是,第二行中的相同数字并不意味着mid = 102时mid = 103访问的位置相同。

数据帧" t"在下面列出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   mid   aid dummy location
1  102 10201     0        0
2  102 10202     1        2
3  102 10203     0        0
4  102 10204     1        4
5  102 10205     0        0
6  102 10206     1        1
7  102 10207     0        0
8  103 10301     0        0
9  103 10302     1        2
10 103 10303     0        0
11 103 10304     1        2
12 103 10305     0        0
13 103 10306     1        3
14 103 10307     0        0

基于上述想法,存储在"位置"字段中的数字应如下更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   mid   aid dummy location
1  102 10201     0        0
2  102 10202     1        1
3  102 10203     0        0
4  102 10204     1        2
5  102 10205     0        0
6  102 10206     1        3
7  102 10207     0        0
8  103 10301     0        0
9  103 10302     1        1
10 103 10303     0        0
11 103 10304     1        1
12 103 10305     0        0
13 103 10306     1        2
14 103 10307     0        0

条件为:

  • 带有" dummy = 0"的位置编号应保持为0
  • 每个"中间"的位置编号应从1开始
  • 如果他(她)访问的位置与上一行中他(她)访问的位置相比有所不同,请在新位置添加1
  • 该操作应在tidyverse提供的管道过程中实施

初始数据帧是使用group_indices或base :: intersection从tidyverse中的管道函数获得的;但是,这些函数有时会返回无序结果。

这个问题有解决方案吗?

我在此链接中使用{data.table}找到了一个解决方案,但我更喜欢使用tidyrverse来保持管道操作。
有很多示例可以在R中给出相同的数字,但是我找不到在不改变其ID顺序的情况下按顺序对这些ID进行重新编号的任何解决方案。


似乎,OP希望在location列中查找以唯一标识组(mid)的位置。如果是这样,那么通过扩展@Frank建议的解决方案,解决方案可以是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
library(dplyr)

t %>% group_by(mid) %>%
  mutate(locationDesired = match(location, unique(location[dummy==1]), nomatch=0)) %>%
  as.data.frame()

#    mid   aid dummy location locationDesired
# 1  102 10201     0        0               0
# 2  102 10202     1        2               1
# 3  102 10203     0        0               0
# 4  102 10204     1        4               2
# 5  102 10205     0        0               0
# 6  102 10206     1        1               3
# 7  102 10207     0        0               0
# 8  103 10301     0        0               0
# 9  103 10302     1        2               1
# 10 103 10303     0        0               0
# 11 103 10304     1        2               1
# 12 103 10305     0        0               0
# 13 103 10306     1        3               2
# 14 103 10307     0        0               0