我在 R 中对交集/组索引的重新编号结果苦苦挣扎了几天。示例数据框如下所示:
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)
)
我需要将“location”字段中存储的数字更新为一组“mid”的连续编号,而不更改其由“aid”定义的顺序。 “mid”是个人(人)的标识符,“aid”代表他们一天内的连续活动日志。
“location”标识每个“mid”访问的位置的唯一ID。因此,第9行的位置“2”和第11行的位置“2”是同一个位置,mid=102;然而,第二行中的相同数字并不意味着 mid=103 对于 mid=102 访问过相同的地方。
数据框“t”列出如下:
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
基于上述想法,“位置”字段中存储的号码应更新如下:
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
- 每个“mid”的位置编号应从 1 开始
- 如果他/她访问的位置与前几行中他/她访问的位置不同,则在新位置上加 1
- 该操作应在 tidyverse 提供的管道进程中执行
初始数据帧是使用 group_indices 或 base::intersection 从 tidyverse 中的管道函数获得的;然而,这些函数有时会返回无序的结果。
对于这个问题有什么解决方案吗?
我找到了一个解决方案这个链接 https://community.rstudio.com/t/why-does-group-indices-use-alphabetical-ordering/5452/4 using {数据.表}但我更喜欢使用 tidyrverse 来保持管道操作。
有很多例子可以给出相同的数字R但我找不到任何解决方案来按顺序对这些 ID 进行重新编号而不更改其顺序。