Создание матрицы на основе временных рядов в разных местах в R - PullRequest
0 голосов
/ 26 сентября 2018

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

По сути, я рассчитываю подсчитать количество перемещений людей между локациями.С каждым движением, считающимся как 1. поскольку я только надеюсь посмотреть на движение, первое местоположение не будет считаться как 1, но движение между первой и второй датой будет считаться как 1, и если человек оставался там, где оно было, оно не будет считаться какдвижение.

Пример фрейма данных (за исключением того, что у меня n лиц и n местоположений):

individual <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3)
locations <- c("L1", "L2", "L2", "L2", "L3", "L2", "L1", "L1", "L2", "L2", "L3", "L3", "L3", "L3", "L1")
date <- c("12/04/2018", "13/04/2018", "14/04/2018", "15/04/2018", "16/04/2018", "12/04/2018", "13/04/2018", "14/04/2018", "15/04/2018", "16/04/2018", "12/04/2018", "13/04/2018", "14/04/2018", "15/04/2018", "16/04/2018")
df <- data.frame(individual, date, locations)
df$individual <- as.factor(df$individual)
df$date <- as.Date(df$date, format = "%d/%m/%Y")

Я пытаюсь создать вывод, который будет выглядеть следующим образом:

B = matrix( 
  c(0, 1, 1, 2, 0, 0, 0, 1, 0), 
  nrow=3, ncol=3
)
colnames(B) = c("L1_moved_to", "L2_moved_to", "L3_moved_to")
rownames(B) = c("L1_moved_from", "L2_moved_from", "L3_moved_from")

Я надеюсь затем построить график этой матрицы, но мне трудно создать начальную матрицу в R

РЕДАКТИРОВАТЬ

, используя мои данные, когдаЯ смотрю на вывод из df_change_with_lag_drop_initial я получаю:

individual1 <- c("b1316", "b1316")
location1 <- c(5, 1)
loc_lag1    <- c(4, 5)
df1 <- data.frame(individual1, location1, loc_lag1)

однако, когда вы смотрите на необработанные данные, это выглядит так:

individual2 <- c("b1316", "b1316", "b1316", "b1316", "b1316", "b1316")
location2 <- c(4, 5, 4, 1, 5, 4)
date2   <- c("07/01/2012", "18/02/2012", "04/01/2013", "03/01/2014", "07/01/2016", "18/02/2017")
df2 <- data.frame(individual2, date2, location2)
df2$individual2 <- as.factor(df2$individual2)
df2$date2 <- as.Date(df2$date2, format = "%d/%m/%Y")
df2$location2 <- as.factor(df2$location2)

, так как я упоминалСчет должен показывать 5 движений (1, 1, 1, 1, 1), но вывод loc_lag равен - 1, 0, 1, 0, 0 - поэтому отображаются только движения между новыми местоположениями.

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете сделать это довольно кратко с помощью data.table следующим образом:

library(data.table)
setDT(df)

df[ , lag_loc := shift(locations), by = individual
    ][locations != lag_loc,
      dcast(.SD, lag_loc ~ locations, fill = 0,
            value.var = 'individual', fun.aggregate = length)]
#    loc_lag L1 L2 L3
# 1:      L1  0  2  0
# 2:      L2  1  0  1
# 3:      L3  1  0  0

Разбить на этапы:

Загрузить data.table;преобразовать df в data.table

 library(data.table)
 setDT(df)

Найти, какие строки соответствуют изменению locations:

df[ , lag_loc := shift(locations), by = individual][]
#    individual       date locations lag_loc
#  1:          1 2018-04-12        L1    <NA>
#  2:          1 2018-04-13        L2      L1
#  3:          1 2018-04-14        L2      L2
#  4:          1 2018-04-15        L2      L2
#  5:          1 2018-04-16        L3      L2
#  6:          2 2018-04-12        L2    <NA>
#  7:          2 2018-04-13        L1      L2
#  8:          2 2018-04-14        L1      L1
#  9:          2 2018-04-15        L2      L1
# 10:          2 2018-04-16        L2      L2
# 11:          3 2018-04-12        L3    <NA>
# 12:          3 2018-04-13        L3      L3
# 13:          3 2018-04-14        L3      L3
# 14:          3 2018-04-15        L3      L3

Подмножество df только в строки, соответствующие locationизменения:

df_change = df[locations != lag_loc]

Изменить эту таблицу на ширину origin ~ destination;fill = 0 означает, что любая не представленная комбинация origin -> destination будет отображаться как 0 (особенно по диагонали).value.var здесь на самом деле не имеет значения, но individual довольно интуитивно понятен, поскольку имеет интерпретацию - при изменении формы мы применяем fun.aggregate ко всем строкам в пределах одной комбинации origin и destination,то есть каждая ячейка в выходных данных должна быть length(individual) для каждой комбинации OD, которая должна быть ясной, чтобы увидеть количество таких индивидуумов:

dcast(df_change, loc_lag ~ locations, fill = 0,
      value.var = 'individual', fun.aggregate = length)
...