首页 > 解决方案 > 根据另一个表中的开始和结束日期填充一个表中的新列

问题描述

我有一个较大的数据表(称为 raw.data)和一个较小的数据表(称为 balldrop.times),列出了事件的开始和结束时间。

我想在较大的数据表中创建一个新列,该列将填充位于较小表中的事件开始日期和结束日期之间的时间。不在事件开始/结束时间之间的时间可以标记为别的,这并不重要。

#the dput of the smaller table
> dput(balldrop.times)
structure(list(Stage = 6:14, 
BallStart = structure(c(1635837081, 1635847841, 1635856675, 1635866152, 1635878326, 1635886132, 1635895547, 1635902934, 1635911136), tzone = "", class = c("POSIXct", "POSIXt")), 
BallEnd = structure(c(1635837364, 1635848243, 1635857005, 1635866475, 1635878704, 1635886465, 1635895905, 1635903786, 1635911457), tzone = "", class = c("POSIXct", "POSIXt"))), 
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L))

#here is part of the larger table just in case
> dput(head(raw.data, 5))
structure(list(DateTime = structure(c(1635825603.6576, 1635825604.608, 1635825605.6448, 1635825606.6816, 1635825607.632), class = c("POSIXct", "POSIXt"), tzone = "GMT"), 
Press.Well = c(1154.2561461, 1154.0308849, 1149.7247783, 1152.0544566, 1155.7363779), 
row.names = c(NA, -5L), 
class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000020725b51ef0>)

我想要的输出类似于以下内容,“事件活动”仅适用于 balldrop.times 表中列出的 DateTime vales 之间的时间:

约会时间 Press.Well 事件状态
2021-11-02 02:11:20 10 事件未激活
2021-11-02 02:11:21 10 活动活动
2021-11-02 02:11:22 15 活动活动
... ... ...
2021-11-02 02:16:04 25 活动活动
2021-11-02 02:16:05 30 事件未激活

我想我可以用来mutate()在 raw.data 表中创建一个新列并为 DateTime 设置条件,但我不确定如何为多个单独的开始/结束 DateTimes 执行此操作。

任何帮助都会得到帮助。谢谢你。

标签: r

解决方案


你的代码不工作。示例表中的时间也不与预期输出中的时间相对应。

tmp <- structure(list(Stage = 6:14, 
               BallStart = structure(c(1635837081, 1635847841, 1635856675, 1635866152, 1635878326, 1635886132, 1635895547, 1635902934, 1635911136), tzone = "", class = c("POSIXct", "POSIXt")), 
               BallEnd = structure(c(1635837364, 1635848243, 1635857005, 1635866475, 1635878704, 1635886465, 1635895905, 1635903786, 1635911457), tzone = "", class = c("POSIXct", "POSIXt"))
               ), 
          class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L))

tmp1 <- structure(list(DateTime = structure(c(1635825603.6576, 1635825604.608, 1635825605.6448, 1635825606.6816, 1635825607.632), class = c("POSIXct", "POSIXt"), tzone = "GMT"),
                      Press.Well = c(1154.2561461, 1154.0308849, 1149.7247783, 1152.0544566, 1155.7363779) ), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L))

所以请注意,这不是一个干净的解决方案。

tmp1 %>% 
  mutate(`Event Status` = case_when(
    DateTime >= (tmp[1,] %>% pull(BallStart)) & DateTime <= (tmp[1,] %>% pull(BallEnd)) ~ "Event Active",
    DateTime >= (tmp[2,] %>% pull(BallStart)) & DateTime <= (tmp[2,] %>% pull(BallEnd)) ~ "Event Active",
    DateTime >= (tmp[3,] %>% pull(BallStart)) & DateTime <= (tmp[3,] %>% pull(BallEnd)) ~ "Event Active",
    DateTime >= (tmp[4,] %>% pull(BallStart)) & DateTime <= (tmp[4,] %>% pull(BallEnd)) ~ "Event Active",
    DateTime >= (tmp[5,] %>% pull(BallStart)) & DateTime <= (tmp[5,] %>% pull(BallEnd)) ~ "Event Active",
    TRUE ~ "Event Not Active"
  ))

因为要比较多个条件,case_when是首选选项而不是ifelse. 我将它与您的参考表中的每一行进行比较。

现在,就像说它不是一个干净的解决方案,因为你有很多行来指定它。使用更大的参考表来检查代码将呈指数增长。但是你可以把它清理成一个函数。


推荐阅读