我正在尝试在数据框中的任何重复日期添加单秒。
即。从这个:
value date
18 2013-07-09 16:49:23
62 2013-07-09 18:01:36
64 2013-07-09 18:46:51
29 2013-07-09 18:46:51
22 2013-07-09 18:46:51
....
我想获得这个:
value date
18 2013-07-09 16:49:23
62 2013-07-09 18:01:36
64 2013-07-09 18:46:51
29 2013-07-09 18:46:52
22 2013-07-09 18:46:53
....
我知道我可以简单地将+ 1或+2添加到POSIXct格式以添加秒数 - 但是我不知道如何选择重复项。请注意,我的数据框长度为几百行,日期最多可连续出现20次。
我正在考虑按照以下方式做点什么:
for (item in duplicated(dataframe$date)) {
if (item == TRUE) {
for (n in 1:#length of duplicated dates) {
dataframe[index(item) +n]$date <- (dataframe[index(item) +n]$date +n)
} } }
感谢您的帮助!
答案 0 :(得分:6)
您可以尝试使用rle
来计算相等日期的运行时长。然后使用重复的长度和sequence
来计算您需要添加的秒数。
r <- rle(as.numeric(df$date))$lengths
r
# [1] 1 1 3
to.add <- sequence(r) - 1
to.add
# [1] 0 0 0 1 2
df$date2 <- df$date + to.add
# Suggestion from @agstudy to make it more general:
df$date2 <- df$date + as.difftime(to.add, unit = "secs")
df[ , c("date", "date2")]
# date date2
# 1 2013-07-09 16:49:23 2013-07-09 16:49:23
# 2 2013-07-09 18:01:36 2013-07-09 18:01:36
# 3 2013-07-09 18:46:51 2013-07-09 18:46:51
# 4 2013-07-09 18:46:51 2013-07-09 18:46:52
# 5 2013-07-09 18:46:51 2013-07-09 18:46:53
您还可以查看有关在?zoo
中修复重复时间索引的示例(未对您的数据进行测试)。
答案 1 :(得分:5)
您可以在xts包中使用make.index.unique
。
x <- structure(list(value = c(18, 62, 64, 29, 22),
date = structure(c(1373406563, 1373410896, 1373413611, 1373413611, 1373413611),
class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("value", "date"),
row.names = c(NA, -5L), class = "data.frame")
x$date.unique <- make.index.unique(x$date,1)
x
# value date date.unique
# 1 18 2013-07-09 16:49:23 2013-07-09 16:49:23
# 2 62 2013-07-09 18:01:36 2013-07-09 18:01:36
# 3 64 2013-07-09 18:46:51 2013-07-09 18:46:51
# 4 29 2013-07-09 18:46:51 2013-07-09 18:46:52
# 5 22 2013-07-09 18:46:51 2013-07-09 18:46:53