【问题标题】:How to change `DateTime` from `df1` to `DateTime2` from `df2` when `df1$DateTime==df2$DateTime`. For the rest of rows of `df1` I subtract 60s当 `df1$DateTime==df2$DateTime` 时,如何将 `DateTime` 从 `df1` 更改为 `DateTime2` 从 `df2`。对于“df1”的其余行,我减去 60s
【发布时间】:2020-01-25 09:52:49
【问题描述】:

我有一个数据框df1,它总结了不同的信息(即Depth)加班(DateTime)。举个例子:

df1 <- data.frame(DateTime=c("2017-08-12 10:18:21.937","2017-08-12 11:43:56.937","2017-08-12 12:22:16.937","2017-08-12 13:24:43.937","2017-08-12 14:35:14.937","2017-08-12 15:48:28.937"),
                 Depth=c(24,12,35,54,13,32))
df1$DateTime <- as.POSIXct(df1$DateTime, format="%Y-%m-%d %H:%M:%OS", tz="UTC")
df1

df1

                 DateTime Depth
1 2017-08-12 10:18:21.937    24
2 2017-08-12 11:43:56.937    12
3 2017-08-12 12:22:16.937    35
4 2017-08-12 13:24:43.937    54
5 2017-08-12 14:35:14.937    13
6 2017-08-12 15:48:28.937    32

在其他数据框df2 中,我过滤了df1,并为剩余的行计算了一个新的DateTime(称为DateTime2),在df2DateTime 和@987654331)中获得了两个不同的时间@)。这是我会得到的一个例子:

df2 <- data.frame(DateTime=c("2017-08-12 11:43:56.937","2017-08-12 14:35:14.937"),
                  DateTime2=c("2017-08-12 11:41:48.337","2017-08-12 14:33:23.476"),
                  Depth=c(12,13))
df2$DateTime <- as.POSIXct(df2$DateTime, format="%Y-%m-%d %H:%M:%OS", tz="UTC")
df2$DateTime2 <- as.POSIXct(df2$DateTime2, format="%Y-%m-%d %H:%M:%OS", tz="UTC")

df2

                DateTime                DateTime2 Depth
1 2017-08-12 11:43:56.937 2017-08-12 11:41:48.336    12
2 2017-08-12 14:35:14.937 2017-08-12 14:33:23.476    13

我想要的是更改df1df1$DateTimedf2$DateTime 重合的行的DateTime,并更改df1$DateTime 的值df2$DateTime2。我还想为 df1$DateTimedf2$DateTime 不重合的其余行减去 60 秒。我希望这样:

df1
                 DateTime Depth
1 2017-08-12 10:17:21.937    24
2 2017-08-12 11:41:48.336    12
3 2017-08-12 12:21:16.937    35
4 2017-08-12 13:23:43.937    54
5 2017-08-12 14:33:23.476    13
6 2017-08-12 15:47:28.937    32

有人知道怎么做吗?

谢谢!!

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    你可以通过"DateTime""Depth"left_join,然后使用coalesce

    library(dplyr)
    
    left_join(df1, df2, by = "DateTime") %>%
       mutate(DateTime = coalesce(DateTime2, DateTime), 
             DateTime = if_else(is.na(DateTime2), DateTime - 60, DateTime)) %>%
       rename(Depth = Depth.x) %>%
       select(names(df1))
    
    #             DateTime Depth
    #1 2017-08-12 10:17:21    24
    #2 2017-08-12 11:41:48    12
    #3 2017-08-12 12:21:16    35
    #4 2017-08-12 13:23:43    54
    #5 2017-08-12 14:33:23    13
    #6 2017-08-12 15:47:28    32
    

    【讨论】:

    • 我想现在我已经纠正了我在df1 中关于DateTime 的错误,我可以从代码中省略Depth,不是吗?
    • 我忘了在我的问题中包括我还希望df1 的其余行与df2DateTime 不一致,我想减去 60 秒。我将把它包含在帖子中,你知道怎么做吗?我想这对你来说很容易。对不起我的错误。
    • 你太棒了!谢谢!!
    【解决方案2】:

    您可以使用来自dplyr 包的left_join

    df1 %>%
      left_join(df2, by = 'Depth') %>%
      mutate(DateTime.x = if_else(!is.na(DateTime2), DateTime2, DateTime.x - 60)) %>%
      select(DateTime = DateTime.x, Depth)
    
    # DateTime Depth
    # 1 2017-08-12 10:17:21    24
    # 2 2017-08-12 11:41:48    12
    # 3 2017-08-12 12:21:16    35
    # 4 2017-08-12 13:23:43    54
    # 5 2017-08-12 14:33:23    13
    # 6 2017-08-12 15:47:28    32
    

    【讨论】:

    • 谢谢!是否有必要在代码中包含“深度”?我的意思是,在这个例子中,'Depth' 没有任何实用程序,尽管如果 'df1$DateTime == df2$DateTime',那么,'df1$Depth == df2$Depth' 是真的。
    • @Dekike 我认为这是必要的,因为第 1 行和第 2 行在df1 中具有相同的DateTime,但仅更改第 2 行的值。为什么?
    • 抱歉,我弄错了...我没有将第 1 行中的 DateTime 更改为 df1。我已经改变了它。我们可以不使用Depth 吗?我提到这是因为在我的真实数据中,Depth 列不存在。我将它包括在数据框中还有其他变量的示例。
    • @AlexB,谢谢您的回复。正如我向 Ronak Shah 提到的那样,我忘了提到 DateTimedf2DateTime 不匹配的 df1 的其余行,我想从它们中减去 60 秒。将其包含在您提议的代码中是否容易?谢谢!
    【解决方案3】:

    使用data.table的更新加入的选项:

    setDT(df1)[, DateTime := DateTime - 60L][
        setDT(df2), on=.(DateTime), DateTime := i.DateTime2]
    

    输出:

                  DateTime Depth
    1: 2017-08-12 10:17:21    24
    2: 2017-08-12 11:42:56    12
    3: 2017-08-12 12:21:16    35
    4: 2017-08-12 13:23:43    54
    5: 2017-08-12 14:34:14    13
    6: 2017-08-12 15:47:28    32
    

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2020-07-27
      • 2021-06-21
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多