Как изменить `DateTime` с` df1` на `DateTime2` с` df2`, когда `df1 $ DateTime == df2 $ DateTime`. Для остальных рядов `df1` я вычитаю 60-е - PullRequest
0 голосов
/ 25 января 2020

У меня есть один фрейм данных 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) для оставшихся строк, получив два разных времени в df2 (DateTime и DateTime2). Вот пример того, что я получу:

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

Я хочу изменить DateTime в df1 для строк, в которых df1$DateTime и df2$DateTime совпадают, и изменить значение df1$DateTime для df2$DateTime2. Я также хочу вычесть 60 секунд для остальных строк, для которых df1$DateTime и df2$DateTime не совпадают. Я бы ожидал этого:

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

Кто-нибудь знает, как это сделать?

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 25 января 2020

Вы можете left_join на "DateTime" и "Depth", а затем использовать 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
2 голосов
/ 25 января 2020

Вы можете использовать left_join из пакета dplyr:

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
1 голос
/ 28 января 2020

Опция, использующая 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...