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希望在
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 |