Как изменить нумерацию результата пересечения / group_indices в R? - PullRequest
0 голосов
/ 03 мая 2018

Я борюсь с изменением нумерации результатов пересечения / group_indices в 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». Таким образом, местоположение «2» в 9-м ряду и в 11-м ряду одинаково для середины = 102; однако одно и то же число во 2-м ряду не означает то же самое место, которое посещают в середине = 103 для середины = 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
  • Номер местоположения должен начинаться с 1 для каждого «середины»
  • Если он / она посетил другое место по сравнению с местами, где он / она посещал в предыдущих строках, добавьте 1 к новому месту
  • Операция должна быть реализована в конвейерном процессе, предоставляемом tidyverse

Исходный фрейм данных получается из функции конвейера в tidyverse с использованием group_indices или base :: intersection; однако эти функции иногда возвращают неупорядоченный результат.

Есть ли какие-либо решения для этой проблемы?

Я нашел одно решение в этой ссылке , используя {data.table} , но я предпочитаю использовать tidyrverse для сохранения операций канала. В R приведено множество примеров, которые дают одинаковые номера, но я не смог найти решений для последовательной нумерации этих идентификаторов без изменения их порядка.

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, 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
...