我的数据框如下
Date_time name
11/1/2016 6:00 A
11/1/2016 6:00 A
11/1/2016 6:00 A
11/1/2016 6:45 A
11/2/2016 11:00 B
11/2/2016 11:00 B
11/2/2016 11:00 B
11/2/2016 11:45 B
以上df应该在15区间内 我们在00分钟后结,下一个应该是15& 30& 45个间隔 O / p应该是
Date_time name New_Date_time
11/1/2016 6:00 A 11/1/2016 6:00
11/1/2016 6:00 A 11/1/2016 6:15
11/1/2016 6:00 A 11/1/2016 6:30
11/1/2016 6:45 A 11/1/2016 6:45
11/2/2016 11:00 B 11/2/2016 11:00
11/2/2016 11:00 B 11/2/2016 11:15
11/2/2016 11:00 B 11/2/2016 11:30
11/2/2016 11:45 B 11/2/2016 11:45
提前致谢
答案 0 :(得分:0)
我假设您的变量Date_time
是一个字符,并且每个name
始终有4个观察值。然后,您可以执行以下操作:
## Your data:
df <- structure(list(Date_time = c("11/1/2016 6:00", "11/1/2016 6:00",
"11/1/2016 6:00", "11/1/2016 6:45", "11/2/2016 11:00", "11/2/2016 11:00",
"11/2/2016 11:00", "11/2/2016 11:45"), name = c("A", "A", "A",
"A", "B", "B", "B", "B")), .Names = c("Date_time", "name"),
class = "data.frame", row.names = c(NA, -8L))
library(dplyr)
library(lubridate)
df <- df %>%
dplyr::mutate(Date_time = as.POSIXct(Date_time, format = "%m/%d/%Y %H:%M")) %>%
group_by(name) %>%
dplyr::mutate(New_Date_time = min(Date_time) + lubridate::minutes(c(0,15,30,45)))
df
# Source: local data frame [8 x 3]
# Groups: name [2]
#
# Date_time name New_Date_time
# <dttm> <chr> <dttm>
# 1 2016-11-01 06:00:00 A 2016-11-01 06:00:00
# 2 2016-11-01 06:00:00 A 2016-11-01 06:15:00
# 3 2016-11-01 06:00:00 A 2016-11-01 06:30:00
# 4 2016-11-01 06:45:00 A 2016-11-01 06:45:00
# 5 2016-11-02 11:00:00 B 2016-11-02 11:00:00
# 6 2016-11-02 11:00:00 B 2016-11-02 11:15:00
# 7 2016-11-02 11:00:00 B 2016-11-02 11:30:00
# 8 2016-11-02 11:45:00 B 2016-11-02 11:45:00
修改强>
如果观察数量不同,则只需将c(0,15,30,45)
替换为seq(from = 0, by = 15, length.out = n())
,即:
df <- df %>%
dplyr::mutate(Date_time = as.POSIXct(Date_time, format = "%m/%d/%Y %H:%M")) %>%
group_by(name) %>%
dplyr::mutate(New_Date_time = min(Date_time) +
lubridate::minutes(seq(from = 0, by = 15, length.out = n())))