【问题标题】:Add and fill in rows based on data above/below根据上方/下方的数据添加和填写行
【发布时间】:2012-09-20 07:36:18
【问题描述】:

我有一个如下所示的数据集:

Date<-c("2009-05-1 10:00:00","2009-05-1 10:05:00","2009-05-1 10:10:00",
"2009-05-1 10:15:00","2009-05-1 10:20:00","2009-05-1 10:25:00")

Dates<-strptime(Date, "%Y-%m-%d %H:%M:%S")

DF<-data.frame(Dates,X=1:6, Y=1:6)

DF
                Dates X Y
1 2009-05-01 10:00:00 1 1
2 2009-05-01 10:05:00 2 2
3 2009-05-01 10:10:00 3 3
4 2009-05-01 10:15:00 4 4
5 2009-05-01 10:20:00 5 5
6 2009-05-01 10:25:00 6 6

按原样,时间戳是每 5 分钟一次。但是我需要每分钟都有一个数据集,所以我希望首先添加丢失的分钟数据,然后估计XY 列数据。 X 列是上面数据的简单填充,Y 是上面/下面数据的平均值。

希望结果如下所示:

              Dates X  Y
2009-05-01 10:00:00 1  1
2009-05-01 10:01:00 1  1.5
2009-05-01 10:02:00 1  1.5
2009-05-01 10:03:00 1  1.5
2009-05-01 10:04:00 1  1.5
2009-05-01 10:05:00 2  2
2009-05-01 10:06:00 2  2.5
2009-05-01 10:07:00 2  2.5
2009-05-01 10:08:00 2  2.5
2009-05-01 10:09:00 2  2.5
2009-05-01 10:10:00 3 3
2009-05-01 10:11:00 3 3.5
2009-05-01 10:12:00 3 3.5
2009-05-01 10:13:00 3 3.5
2009-05-01 10:14:00 3 3.5
2009-05-01 10:15:00 4 4
2009-05-01 10:16:00 4 4.5
2009-05-01 10:17:00 4 4.5
2009-05-01 10:18:00 4 4.5
2009-05-01 10:19:00 4 4.5
2009-05-01 10:20:00 5 5
2009-05-01 10:21:00 5 5.5
2009-05-01 10:22:00 5 5.5
2009-05-01 10:23:00 5 5.5
2009-05-01 10:24:00 5 5.5
2009-05-01 10:25:00 6 6

任何关于如何去做这件事的想法将不胜感激。

【问题讨论】:

  • 为什么每分钟都需要它? (它没有添加任何信息...)
  • 我打算将这个数据集与其他几个数据集合并,所有这些都是按分钟计算的。所以我知道这是作弊,但这是我唯一能想到的。
  • 在这种情况下,您可能应该更平滑地插入值,而不是将所有中间行 Ys 分配为相同的平均值。例如,在这种情况下,您希望 Y 看起来像 1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6... 您可以为此使用 smooth.spline(在这种情况下,您的“x”是时间)。但即使在每对值之间进行严格的线性插值(如上面的1, 1.2, 1.4)也会让它变得更好。
  • 谢谢大卫,这是一个很好的观点,我会尝试将平滑合并到我的数据中

标签: r


【解决方案1】:

这是一种方法:

Date <- c("2009-05-1 10:00:00","2009-05-1 10:05:00","2009-05-1 10:10:00","2009-05-1 10:15:00","2009-05-1 10:20:00","2009-05-1 10:25:00")

Dates <- strptime(Date, "%Y-%m-%d %H:%M:%S")

DF <- data.frame(Dates,X=1:6, Y=1:6)
DF2 <- merge(DF,data.frame(Dates=DF$Dates - 5 * 60, YNext=DF$Y),by='Dates',all.x=T,all.y=F)
DF3 <- merge(DF2,data.frame(Dates=seq(from=min(DF2$Dates),to=max(DF2$Dates),by='1 min')),by='Dates',all=TRUE)

tmpFun <- function(d){
  d$X <- na.omit(d$X)[1]
  d$Y <- ifelse(is.na(d$Y),(na.omit(d$Y)[1] + na.omit(d$YNext)[1]) / 2,d$Y)
  return(d)
}

DF4 <- do.call(rbind,by(DF3,INDICES=(as.POSIXlt(DF3$Dates)$min %/% 5),FUN=tmpFun))

# "beautify" the data.frame (set the row names, and remove the YNext column)
row.names(DF4) <- 1:nrow(DF4)
DF4$YNext <- NULL

结果:

> DF4
                 Dates X   Y
1  2009-05-01 10:00:00 1 1.0
2  2009-05-01 10:01:00 1 1.5
3  2009-05-01 10:02:00 1 1.5
4  2009-05-01 10:03:00 1 1.5
5  2009-05-01 10:04:00 1 1.5
6  2009-05-01 10:05:00 2 2.0
7  2009-05-01 10:06:00 2 2.5
8  2009-05-01 10:07:00 2 2.5
9  2009-05-01 10:08:00 2 2.5
10 2009-05-01 10:09:00 2 2.5
11 2009-05-01 10:10:00 3 3.0
12 2009-05-01 10:11:00 3 3.5
13 2009-05-01 10:12:00 3 3.5
14 2009-05-01 10:13:00 3 3.5
15 2009-05-01 10:14:00 3 3.5
16 2009-05-01 10:15:00 4 4.0
17 2009-05-01 10:16:00 4 4.5
18 2009-05-01 10:17:00 4 4.5
19 2009-05-01 10:18:00 4 4.5
20 2009-05-01 10:19:00 4 4.5
21 2009-05-01 10:20:00 5 5.0
22 2009-05-01 10:21:00 5 5.5
23 2009-05-01 10:22:00 5 5.5
24 2009-05-01 10:23:00 5 5.5
25 2009-05-01 10:24:00 5 5.5
26 2009-05-01 10:25:00 6 6.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2020-09-04
    • 2019-07-31
    • 2015-06-19
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多