【发布时间】:2015-07-07 20:13:26
【问题描述】:
我有一个关于 R 的编程问题,我一直在寻找解决方案,但似乎无法在网上找到。我正在使用一个数据集,该数据集随着时间的推移跟踪医院提供者的位置。因此,有一个唯一的 ID 来识别员工以及与相关位置相关的各种时间戳。我有一个距离矩阵,它描述了某些位置(A 到 E)彼此之间的距离,并且我有兴趣在整个数据集中聚合它(计算总步行距离)。
我的距离矩阵是一个 5x5 矩阵,描述从 Section X 到 Section Y 的移动,其中 X 和 Y 属于 Section A 到 E 的子集。下面描述距离矩阵:
dmatrix=matrix(c(1, 2, 2, 3, 4, 2, 1, 2, 3, 4, 2, 2, 1, 2, 3, 3, 3, 2, 1, 2, 4, 4, 3, 2, 1), nrow=5, ncol=5)
colnames(dmatrix)<-c("sectionA", "sectionB", "sectionC", "sectionD", "sectionE")
rownames(dmatrix)<-c("sectionA", "sectionB", "sectionC", "sectionD", "sectionE")
我的数据框是一个 500 万行的数据集,其中包含所有员工所在的位置。目标是计算每个员工 ID 在任何一天步行的总距离(通过从上面的距离矩阵中读取)。
我可以通过使用以下代码按日期和 ID 对数据进行子设置来成功地做到这一点:
jun10<-subset(dataframe,format(dataframe$st,'%m/%d')=='06/10')
jun1013<-jun10[jun10$id==13,]
jun1013[with(jun1013, order(st)),]
for(i in 1:nrow(jun1013))
{
jun1013$distance[i]=dmatrix[cbind(as.character(jun1013$section[i-1]),as.character(jun1013$section[i]))]
}
sum(jun1013$distance, na.rm=TRUE)
注意:“dataframe”是数据帧名称,dataframe$st 是 POSIXlt 时间戳数据,在这种情况下,我将提取 6 月 10 日的所有条目,然后提取 6 月 10 日 ID 号 13 的所有条目。这段代码给出我是 13 号员工在 6 月 10 日步行的总距离。
这是显示头部(数据帧)的输出:
id room start stop duration roomname starttimelocal endtimelocal durationseconds source resident attending1 attending2 unit X_merge
1 104 ED-BCKNST (STAFF ROOM) 28feb2013 13:42:45 28feb2013 13:42:47 2 ED-BCKNST (STAFF ROOM) 2/28/2013 1:42:45 PM 2/28/2013 1:42:47 PM 00:00:02 1 0 0 0 EMERGENCY matched (3)
2 104 ED-BCKNST (STAFF ROOM) 28feb2013 13:37:46 28feb2013 13:37:51 5 ED-BCKNST (STAFF ROOM) 2/28/2013 1:37:46 PM 2/28/2013 1:37:51 PM 00:00:05 1 0 0 0 EMERGENCY matched (3)
3 104 ED-PELEV (STAFF ROOM) 14may2013 09:08:31 14may2013 09:08:35 4 ED-PELEV (STAFF ROOM) 5/14/2013 9:08:31 AM 5/14/2013 9:08:35 AM 00:00:04 2 0 0 0 EMERGENCY matched (3)
4 104 ED-BCKNST (STAFF ROOM) 28feb2013 09:34:34 28feb2013 09:34:38 4 ED-BCKNST (STAFF ROOM) 2/28/2013 9:34:34 AM 2/28/2013 9:34:38 AM 00:00:04 1 0 0 0 EMERGENCY matched (3)
5 104 ED-BCKNST (STAFF ROOM) 28feb2013 09:27:02 28feb2013 09:27:09 7 ED-BCKNST (STAFF ROOM) 2/28/2013 9:27:02 AM 2/28/2013 9:27:09 AM 00:00:07 1 0 0 0 EMERGENCY matched (3)
6 104 ED-BCKNST (STAFF ROOM) 26feb2013 19:07:56 26feb2013 19:08:01 5 ED-BCKNST (STAFF ROOM) 2/26/2013 7:07:56 PM 2/26/2013 7:08:01 PM 00:00:05 1 0 0 0 EMERGENCY matched (3)
st categ section day
1 2013-02-28 01:42:45 staffrm sectionE 02/28
2 2013-02-28 01:37:46 staffrm sectionE 02/28
3 2013-05-14 09:08:31 staffrm sectionE 05/14
4 2013-02-28 09:34:34 staffrm sectionE 02/28
5 2013-02-28 09:27:02 staffrm sectionE 02/28
6 2013-02-26 07:07:56 staffrm sectionE 02/26
如何对所有数据执行此操作?我尝试创建 if 循环以按日期和 ID 执行此操作,但我不断在字段中收到错误或 NA。
完美的解决方案是通过数据,计算步行的总距离,类似于我上面所做的,然后输出到一个矩阵,其中每一列描述一个独特的日子(如 6 月 10 日、11 日、12 日等.) 并且行是在给定日期工作的唯一 ID。矩阵中的条目将是描述总步行距离的总和。请注意,每天工作的员工人数不同。
不确定这是否可能,我已经坚持了一个多星期了 - 任何帮助、见解或建议都会非常有帮助 - 谢谢!!
【问题讨论】:
-
您能发布至少一部分数据集吗?看不见就很难帮忙。
-
@Chris 非常感谢!我希望这会有所帮助。