基于R中不同位置的时间序列创建矩阵
我期待着创建一个功能,创建一个矩阵的基础上运动的众多独特的个人ID的不同日期到不同的位置 从本质上说,我希望统计个人在不同地点之间的移动次数。每一个动作都以1计。因为我只希望看一看运动,第一个地点不会算作1,但第一次和第二次日期之间的运动会算作1,如果个人停留在原地,则不会算作运动 一个示例数据框是(除了我有n个个体和n个位置): 我希望随后绘制该矩阵,但我发现很难在基于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
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)