如果在两次之间,我如何从另一个 table return 获取值?
How do I return value from another table if between two times?
我有一个数据集,它查看特定 "run" 发生的时间。这是数据集的 head() 。
time <- c(15:27.7, 15:27.7, 15:27.8, 15:27.9, 15:28.0)
我希望 return 一个 "run number",如果时间值介于数据帧中的特定时间之间,它将 return 相应的 运行。 "lookup" table 如下。
START END Run
<fct> <fct> <int>
1 15:27.7 15:29.1 1
2 20:32.3 20:37.3 2
3 25:57.3 25:58.7 3
4 17:53.8 17:54.0 4
我想要的 运行 结果应该是:
TIME Run
1 15:27.7 1
2 15:27.7 1
3 15:27.8 1
4 15:27.9 1
5 15:28.0 1
我想我可能需要更改时间格式,但也不知道该怎么做。
如有任何帮助,我们将不胜感激。
是的 - 您必须将所有 "times" 转换为 date/time 或 "POSIXct" [=26],这些看起来像查找 table 中的因子=] 对象,以便您可以查找值。 as.POSIXct
函数可以为您做到这一点。
df$time2 <- as.POSIXct(df$time, format="%M:%OS")
lkup$START <- as.POSIXct(lkup$START, format="%M:%OS")
lkup$END <- as.POSIXct(lkup$END, format="%M:%OS")
然后根据主数据框中的时间值,使用多种方法中的一种从查找 table 中查找 运行 值。在这里,我将使用数据 table 的非等值连接,因为它相当简单。
library(data.table)
setDT(lkup)[setDT(df), on=.(START<=time2, END>=time2), .(id, time, Run)]
id time Run
1: 1 15:27.7 1
2: 2 15:29.1 1
3: 3 20:32.3 2
4: 4 25:58.7 3
5: 5 17:53.9 4
数据:
df <- structure(list(id = 1:5, time = c("15:27.7", "15:29.1", "20:32.3",
"25:58.7", "17:53.9")), class = "data.frame", row.names = c(NA,
-5L))
id time
1 1 15:27.7
2 2 15:29.1
3 3 20:32.3
4 4 25:58.7
5 5 17:53.9
lkup <- structure(list(START = c("15:27.7", "20:32.3", "25:57.3", "17:53.8"
), END = c("15:29.1", "20:37.3", "25:58.7", "17:54.0"), Run = 1:4), class = "data.frame", row.names = c("1",
"2", "3", "4"))
START END Run
1 15:27.7 15:29.1 1
2 20:32.3 20:37.3 2
3 25:57.3 25:58.7 3
4 17:53.8 17:54.0 4
我有一个数据集,它查看特定 "run" 发生的时间。这是数据集的 head() 。
time <- c(15:27.7, 15:27.7, 15:27.8, 15:27.9, 15:28.0)
我希望 return 一个 "run number",如果时间值介于数据帧中的特定时间之间,它将 return 相应的 运行。 "lookup" table 如下。
START END Run
<fct> <fct> <int>
1 15:27.7 15:29.1 1
2 20:32.3 20:37.3 2
3 25:57.3 25:58.7 3
4 17:53.8 17:54.0 4
我想要的 运行 结果应该是:
TIME Run
1 15:27.7 1
2 15:27.7 1
3 15:27.8 1
4 15:27.9 1
5 15:28.0 1
我想我可能需要更改时间格式,但也不知道该怎么做。
如有任何帮助,我们将不胜感激。
是的 - 您必须将所有 "times" 转换为 date/time 或 "POSIXct" [=26],这些看起来像查找 table 中的因子=] 对象,以便您可以查找值。 as.POSIXct
函数可以为您做到这一点。
df$time2 <- as.POSIXct(df$time, format="%M:%OS")
lkup$START <- as.POSIXct(lkup$START, format="%M:%OS")
lkup$END <- as.POSIXct(lkup$END, format="%M:%OS")
然后根据主数据框中的时间值,使用多种方法中的一种从查找 table 中查找 运行 值。在这里,我将使用数据 table 的非等值连接,因为它相当简单。
library(data.table)
setDT(lkup)[setDT(df), on=.(START<=time2, END>=time2), .(id, time, Run)]
id time Run
1: 1 15:27.7 1
2: 2 15:29.1 1
3: 3 20:32.3 2
4: 4 25:58.7 3
5: 5 17:53.9 4
数据:
df <- structure(list(id = 1:5, time = c("15:27.7", "15:29.1", "20:32.3",
"25:58.7", "17:53.9")), class = "data.frame", row.names = c(NA,
-5L))
id time
1 1 15:27.7
2 2 15:29.1
3 3 20:32.3
4 4 25:58.7
5 5 17:53.9
lkup <- structure(list(START = c("15:27.7", "20:32.3", "25:57.3", "17:53.8"
), END = c("15:29.1", "20:37.3", "25:58.7", "17:54.0"), Run = 1:4), class = "data.frame", row.names = c("1",
"2", "3", "4"))
START END Run
1 15:27.7 15:29.1 1
2 20:32.3 20:37.3 2
3 25:57.3 25:58.7 3
4 17:53.8 17:54.0 4