首页 > 解决方案 > For Loops:移动范围

问题描述

所以我正在做的是为 x 和 y 坐标创建热图。但我想每隔 30 分钟做一次。例如,将使用从“00:00:00”到“00:30:00”的数据创建第一个热图,然后使用从“00:01:00”到“00:31:00”的数据创建下一个热图。

我需要帮助的是编写一个 for 循环,该循环可以从更大的数据库中提取这些行,然后为每个数据括号输出热图。

该数据库具有三列 x、y 和 indiv.times。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))

标签: rfor-loop

解决方案


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 分钟标记一次的 bin:

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
}

推荐阅读