考虑这组时间点:
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之外的所有其他时间等)。谢谢。
答案 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
并没有真正超越outer
。使用这两种方法,您只能使用相对较小的数据集。但是,在数据集的长度大于几百的情况下,似乎最好使用sapply
。
此外,在我的计算机上,当N = 5500
outer
与Error: cannot allocate vector of size 230.8 Mb
崩溃但sapply
仍然有效时,即使N = 15000
经过的时间大约为90秒。您可以在自己的计算机上查看there is a code。