所以我在做的是为x和y坐标创建一个热图。但我想每30分钟间隔一次。例如,将使用从“ 00:00:00”到“ 00:30:00”的数据创建第一个热图,然后从“ 00:01:00”到“ 00:31:00”创建下一个热图。>
我需要帮助的是编写一个for循环,该循环可以从较大的数据库中提取这些行,然后为每个数据支架吐出热图。
数据库具有三列x,y和单个时间。 x和y是坐标系,并且indiv.times是一个字符变量,例如,其格式为“ 13:04:46”。
for (i in ???) {
kde <- kde2d(x, y)
plot_ly(z = kde$z, type = "heatmap")
}
这是创建热图的代码,所以我真的只需要一种提取30分钟间隔的方法。
任何帮助将不胜感激。
编辑:
以下是数据库示例:
structure(list(x = c(224.7666, 223.3886, 131.7025, 345.333),
y = c(60.7657, 85.73872, 77.35342, 26.24607), indiv.times = c("14:00:02",
"14:00:02", "14:00:03", "05:10:26")), class = "data.frame", row.names = c(NA, -4L))
答案 0 :(得分:0)
一种方法是使用split
和findInterval
按间隔对它们进行装箱。
您的数据有点短,我将生成一些示例:
set.seed(3)
df <- data.frame(
time = Sys.time() + cumsum(60*sample(20, size=10, replace=TRUE))
)
df
# time
# 1 2018-10-29 21:18:10
# 2 2018-10-29 21:35:10
# 3 2018-10-29 21:43:10
# 4 2018-10-29 21:50:10
# 5 2018-10-29 22:03:10
# 6 2018-10-29 22:16:10
# 7 2018-10-29 22:19:10
# 8 2018-10-29 22:25:10
# 9 2018-10-29 22:37:10
# 10 2018-10-29 22:50:10
让我们生成一些将每30分钟标记一次的垃圾箱:
bins <- seq(
round(min(df$time), "hour"),
round(max(df$time) + 15*60, "hour"),
by = "30 min"
)
bins
# [1] "2018-10-29 21:00:00 PDT" "2018-10-29 21:30:00 PDT"
# [3] "2018-10-29 22:00:00 PDT" "2018-10-29 22:30:00 PDT"
# [5] "2018-10-29 23:00:00 PDT"
现在将事情分解>
split(df, list(findInterval(df$time, bins)))
# $`1`
# time
# 1 2018-10-29 21:18:10
# $`2`
# time
# 2 2018-10-29 21:35:10
# 3 2018-10-29 21:43:10
# 4 2018-10-29 21:50:10
# $`3`
# time
# 5 2018-10-29 22:03:10
# 6 2018-10-29 22:16:10
# 7 2018-10-29 22:19:10
# 8 2018-10-29 22:25:10
# $`4`
# time
# 9 2018-10-29 22:37:10
# 10 2018-10-29 22:50:10
因此您可以轻松地执行以下操作:
for (d in split(df, list(findInterval(df$time, bins)))) {
# d is a data.frame with all data inside a 30-min interval
}