在许多时间点之间创建成对持续时间的向量

时间:2018-06-14 10:58:22

标签: r

考虑这组时间点:

time1 <- as.Date("2011/04/05")
time2 <- as.Date("2011/05/17")
time3 <- as.Date("2011/06/27")
time4 <- as.Date("2011/08/16")
time5 <- as.Date("2011/10/05")
time6 <- as.Date("2011/11/21")

我想创建一个包含时间点之间所有成对持续时间的向量。对于6个时间点,这是可以管理的,但已经很乏味了:

time.elapsed <- as.numeric(c(abs(time1-time2),abs(time1-time3),
                             abs(time1-time4),abs(time1-time5),
                             abs(time1-time6),abs(time2-time3),
                             abs(time2-time4),abs(time2-time5),
                             abs(time2-time6),abs(time3-time4),
                             abs(time3-time5),abs(time3-time6),
                             abs(time4-time5),abs(time4-time6),
                             abs(time5-time6)))

time.elapsed
 [1]  42  83 133 183 230  41  91 141 188  50 100 147  50  97  47

如何在更多时间点(例如15或20)简化此代码? 保持格式如上所述(首先是时间点1和所有其他时间之间的所有持续时间,然后是时间点2和除1之外的所有其他时间等)。谢谢。

2 个答案:

答案 0 :(得分:1)

我认为这会对你有帮助

df <- data.frame(time = c(time1, time2, time3, time4, time5, time6) )

outer( df$time, df$time , "-" )

Time differences in days
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0  -42  -83 -133 -183 -230
[2,]   42    0  -41  -91 -141 -188
[3,]   83   41    0  -50 -100 -147
[4,]  133   91   50    0  -50  -97
[5,]  183  141  100   50    0  -47
[6,]  230  188  147   97   47    0

获得您的首选结果,获取矩阵的下三角

outer( df$time, df$time , "-" )[lower.tri( outer( df$time, df$time , "-" ) )]

Time differences in days
 [1]  42  83 133 183 230  41  91 141 188  50 100 147  50  97  47

答案 1 :(得分:1)

使用sapply还有另一种解决方案:

# Data from the example
dt <- as.Date(c("2011/04/05", 
                "2011/05/17", 
                "2011/06/27", 
                "2011/08/16", 
                "2011/10/05", 
                "2011/11/21")
              )
# Difftime with sapply
unlist(sapply(seq_along(dt), function(i) difftime(dt[-(1:i)], dt[i])))
# [1]  42  83 133 183 230  41  91 141 188  50 100 147  50  97  47

在我们使用小数据集之前,@ Wimpel方法和我的方法之间的差异可以忽略不计。但是,使用相对大数据集,您会发现性能上的差异(在我的笔记本电脑上我可以看到它从N> 500开始):

sapply vs outer - performance

偏离课程sapply并没有真正超越outer。使用这两种方法,您只能使用相对较小的数据集。但是,在数据集的长度大于几百的情况下,似乎最好使用sapply

此外,在我的计算机上,当N = 5500 outerError: cannot allocate vector of size 230.8 Mb崩溃但sapply仍然有效时,即使N = 15000经过的时间大约为90秒。您可以在自己的计算机上查看there is a code