我正在努力将R中的intersection / group_indices的结果重新编号几天。示例数据框如下所示:
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)
)
我需要更新存储在&#34; location&#34;由一群&#34; mid&#34;不改变由&#34;援助&#34;定义的顺序。 &#34;中间&#34;是个人(人)的标识符和&#34;援助&#34;在一天内表示其顺序活动日志。 &#34;位置&#34;标识每个&#34; mid&#34;所访问的位置的唯一ID。因此,位置&#34; 2&#34;在第9行和第11行是中间= 102的相同位置;但是,第二行中相同的数字并不意味着中间= 103访问的同一个地方=中期= 102。
数据框&#34; t&#34;如下所列:
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
基于上述想法,数字存储在&#34; location&#34;字段应更新如下:
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
条件是:
初始数据帧是使用group_indices或base :: intersection从tidyverse中的管道函数获得的;但是,这些函数有时会返回无序结果。
这个问题有什么解决方案吗?
我使用 {data.table} 在this link中找到了一个解决方案,但我更喜欢使用tidyrverse来保持管道操作。 有很多例子可以在 R 中给出相同的数字,但我找不到任何解决方案来按顺序重新编号这些ID而不改变它的顺序。
答案 0 :(得分:1)
看起来,OP希望在location
列中查找以唯一标识组的位置(mid
)。如果是这样,那么通过扩展@Frank建议的解决方案,解决方案可以是:
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