Как создать набор данных панели из данных даты перехода в R? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть набор данных, который структурирован следующим образом:

ID   origin   destination  time
1     a        b           2
2     b        a           1
2     a        c           4
3     c        b           1
3     b        c           3

Я бы хотел превратить это в набор данных панели ID-time, например:

ID   location  time
1     a        1
1     b        2
1     b        3
1     b        4
2     a        1
2     a        2
2     a        3
2     c        4
3     b        1
3     b        2
3     c        3
3     c        4

Таким образом, в основном мне нужно создать ряды панели для случая, когда субъект не меняет местоположение, и заполнить местоположение, в котором он должен находиться, на основе информации о источнике и местах назначения. Есть ли функция в R, которая может сделать это гладко? Я бы предпочел решения с использованием data.table или dplyr.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Метод, аналогичный решению Фрэнка, но с использованием двух объединений:

library(data.table)
res <- setDT(expand.grid(ID = unique(dt$ID), time = 1:4))

#Get origin
res[dt[,.(ID, origin, time = time - 1L)], location := origin, on = .(ID = ID, time = time)]

#Update origin and destination
res[dt, location := destination, on = c("ID", "time")][, location := zoo::na.locf(location), by = ID][order(ID, time)]

 #   ID time location
 #1:  1    1        a
 #2:  1    2        b
 #3:  1    3        b
 #4:  1    4        b
 #5:  2    1        a
 #6:  2    2        a
 #7:  2    3        a
 #8:  2    4        c
 #9:  3    1        b
#10:  3    2        b
#11:  3    3        c
#12:  3    4        c
0 голосов
/ 30 апреля 2018

Я не думаю, что вам нужно делать необычные соединения для этой проблемы:

maxt = max(dt$time)
dt[, .(location = c(rep(origin[1], time[1] - 1), rep(destination, diff(c(time, maxt + 1)))),
       time = 1:maxt), by = ID]
#    ID location time
# 1:  1        a    1
# 2:  1        b    2
# 3:  1        b    3
# 4:  1        b    4
# 5:  2        a    1
# 6:  2        a    2
# 7:  2        a    3
# 8:  2        c    4
# 9:  3        b    1
#10:  3        b    2
#11:  3        c    3
#12:  3        c    4

Я предположил, что в пределах одного идентификатора следующий источник совпадает с предыдущим пунктом назначения, как в примере с OP.

0 голосов
/ 30 апреля 2018

Вы можете составить таблицу с каждым time, для которого вы хотите знать location каждого ID:

newDT = DT[, CJ(ID = unique(ID), time = 1:4)]

Затем поместите исходные данные в длинный формат, выводя, что

  • начало координат для time-1
  • пункт назначения сохраняется для time
mDT = melt(DT, id = c("ID", "time"), value.name = "loc", variable.name = "loc_role")
mDT[loc_role == "origin", time := time - 1L]
mDT[, loc_role := NULL]
setorder(mDT, ID, time)

    ID time loc
 1:  1    1   a
 2:  1    2   b
 3:  2    0   b
 4:  2    1   a
 5:  2    3   a
 6:  2    4   c
 7:  3    0   c
 8:  3    1   b
 9:  3    2   b
10:  3    3   c

... и заполните новую таблицу с непрерывным обновлением соединения:

newDT[, location := mDT[.SD, on=.(ID, time), roll=TRUE, x.loc]]

    ID time location
 1:  1    1        a
 2:  1    2        b
 3:  1    3        b
 4:  1    4        b
 5:  2    1        a
 6:  2    2        a
 7:  2    3        a
 8:  2    4        c
 9:  3    1        b
10:  3    2        b
11:  3    3        c
12:  3    4        c

(у Dplyr пока нет переходов или обновлений, так что, думаю, аналога нет.)

Как это работает

  • CJ принимает декартово произведение некоторых векторов, аналогичное expand.grid
  • melt преобразуется в длинную форму, сохраняя переменные, передаваемые как id =
  • x[i, v := expr] редактирует столбец v таблицы x в строках, выбранных с помощью i
  • setorder сортировка на месте
  • .SD в j из x[i,j] относится к подмножеству данных (x), выбранному из i
  • x[i, on=, roll=, expr] - это скользящее соединение со строками, выбранными таблицей i, on= и roll=
  • Выражение x.v внутри объединения выбирает столбец v из x

Что касается последнего маркера, префикс i.* будет делать то же самое для столбцов из i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...