对于循环:移动范围

时间:2018-10-30 01:25:18

标签: r for-loop

所以我在做的是为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))

1 个答案:

答案 0 :(得分:0)

一种方法是使用splitfindInterval按间隔对它们进行装箱。

您的数据有点短,我将生成一些示例:

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
}
相关问题