基于R中不同位置的时间序列创建矩阵

基于R中不同位置的时间序列创建矩阵,r,matrix,social-networking,R,Matrix,Social Networking,我期待着创建一个功能,创建一个矩阵的基础上运动的众多独特的个人ID的不同日期到不同的位置 从本质上说,我希望统计个人在不同地点之间的移动次数。每一个动作都以1计。因为我只希望看一看运动,第一个地点不会算作1,但第一次和第二次日期之间的运动会算作1,如果个人停留在原地,则不会算作运动 一个示例数据框是(除了我有n个个体和n个位置): 我希望随后绘制该矩阵,但我发现很难在R 编辑 当我查看df\u change\u和\u lag\u drop\u initial的输出时,使用我的数据,我得到: in

我期待着创建一个功能,创建一个矩阵的基础上运动的众多独特的个人ID的不同日期到不同的位置

从本质上说,我希望统计个人在不同地点之间的移动次数。每一个动作都以1计。因为我只希望看一看运动,第一个地点不会算作1,但第一次和第二次日期之间的运动会算作1,如果个人停留在原地,则不会算作运动

一个示例数据框是(除了我有n个个体和n个位置):

我希望随后绘制该矩阵,但我发现很难在
R

编辑 当我查看
df\u change\u和\u lag\u drop\u initial的输出时,使用我的数据,我得到:

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

individual1您可以使用
数据非常简洁地完成此操作。表如下所示:

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
分为几个步骤:

加载
数据。表格
;将
df
转换为
数据表

 library(data.table)
 setDT(df)
查找与
位置更改相对应的行

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
将此表格改宽为
origin~ destination
fill=0
表示任何未表示的
起点
->
目的地
组合将显示为0(特别是沿对角线)
value.var
在这里实际上并不重要,但是
individual
非常直观,因为它具有以下解释——当我们重塑时,我们将
fun.aggregate
应用于
原点
目的地
相同组合中的所有行,即输出中的每个单元格都应该是
长度(个体)
对于每个O-D组合,应清楚地看到这些个体的数量:

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

非常感谢你的回答,这很好,几乎就是我想要的。整个过程中添加的信息令人惊讶。2来自代码中个人1从第1-2行和个人2从第8-9行的移动:df[,row_change_id:=rowid(个人,位置)][]。在您的sig_id中,不是第8行和第9行是2,而是第9行应该是1。@d事实上,我最初的回答是错误的,我以为我涵盖了我未能涵盖的案例。现在修好了,太棒了。我一直在查看我的数据,似乎还有其他问题。如果该位置已经被使用过,那么它似乎会将其从分组的其余部分中删除,即使该个人可能会再次返回该位置。我的意思是,例如,如果你把这些作为位置ID(4,5,4,1,5,4),然后个体在它们之间移动,它应该看起来像-1,1,1,1,1-在移动分数方面,但我认为代码正在做的是给-1,0,1,0-作为输出。这有意义吗?谢谢你的帮助。非常感谢。@DFinch我不确定我是否遵守了,您能在问题的示例中包含这一点吗?也许您没有使用更新的代码?这显示了5个动作:
df2[,lag\u loc:=shift(location2),by=individual2][location2!=lag\u loc,dcast(.SD,lag\u loc~location2,fill=0,value.var='individual2',fun.aggregate=length)]
b1316在该数据中set@MichaelChirico我想我已经发现了问题,但不确定如何解决。当代码的这一部分运行时,它标识了五个更改。然而,在df2[,row\u change\u id:=rowid(individual2,location2)][]期间发生了一些事情,当它转换/排列它们时,以前使用过的因素(站点编号)不会作为新的移动出现。当您查看一次df2的输出
df2[,row_change_id:=rowid(individual2,location2)][
运行时,您可以看到
row_change_id
不是1,而是2/3,就好像个人在同一个地方一样。再次,我不确定您使用的是更新的答案。。。我再也不用罗维德道歉了。你是对的。非常感谢你的帮助。
 library(data.table)
 setDT(df)
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_change = df[locations != lag_loc]
dcast(df_change, loc_lag ~ locations, fill = 0,
      value.var = 'individual', fun.aggregate = length)