如何重新编号R中的intersection / group_indices结果?

时间:2018-05-03 17:01:53

标签: r dplyr tidyr tidyverse

我正在努力将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

条件是:

  • 位置编号为&#34; dummy = 0&#34;应该保持为0
  • 每个&#34; mid&#34;
  • 的位置编号应从1开始
  • 如果他/她访问的位置与前一行中他/她访问过的地点相比,请将1添加到新位置
  • 操作应在tidyverse提供的管道处理中实施

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

这个问题有什么解决方案吗?

我使用 {data.table} this link中找到了一个解决方案,但我更喜欢使用tidyrverse来保持管道操作。 有很多例子可以在 R 中给出相同的数字,但我找不到任何解决方案来按顺序重新编号这些ID而不改变它的顺序。

1 个答案:

答案 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