如何在R

时间:2017-06-02 05:46:18

标签: r

我是R Studio的新手,我有一个问题:

我有以下数据:(日期;时间;价值)

02.01.11;11:00;576
02.01.11;11:05;552
02.01.11;11:10;672
02.01.11;11:15;720
02.01.11;11:20;336
02.01.11;11:25;408
02.01.11;11:30;288
02.01.11;11:35;228
02.01.11;11:40;288
02.01.11;11:45;288
02.01.11;11:50;288
02.01.11;11:55;312
02.01.11;12:00;180
02.01.11;12:05;120
02.01.11;12:10;120
02.01.11;12:15;228
02.01.11;12:20;276
02.01.11;12:25;228
02.01.11;12:30;444
02.01.11;12:35;612
02.01.11;12:40;300
02.01.11;12:45;288
02.01.11;12:50;300
02.01.11;12:55;336
02.01.11;13:00;240
02.01.11;13:05;252
02.01.11;13:10;192
02.01.11;13:15;180
02.01.11;13:20;192
02.01.11;13:25;432
02.01.11;13:30;912
02.01.11;13:35;960
02.01.11;13:40;936
02.01.11;13:45;1260
02.01.11;13:50;1008

对于某些计算,我需要在1分钟的时间范围内。 那么有人可以帮助我找出,我如何插入"缺失"价值,以便它们适合现在的?

我使用此命令获取Dataframe:

df <- read_delim("~/values.txt", ";", escape_double = FALSE, col_types = cols(Date = col_date(format = "%d.%m.%y"), Value = col_double(), Time = col_time(format = "%H:%M")), trim_ws = TRUE)

2 个答案:

答案 0 :(得分:0)

为了处理分钟数据,我建议使用包xts和包na.approx中的函数zoo。简而言之,您需要创建一个空数字分钟数据,您将merge包含原始数据。然后,您可以使用na.approx来估算缺失值。

#Intial data, not by minute    
datetime <- Sys.time()
date_time_init <- Sys.time()+c(0,3,5,8)*60
df1 <- xts(c(1:4),date_time_init)
> df1
                    [,1]
2017-06-02 03:10:20    1
2017-06-02 03:13:20    2
2017-06-02 03:15:20    3
2017-06-02 03:18:20    4

#Create time sequence by minute
date_time_complete <- seq.POSIXt(from=min(date_time_init),
                                 to=max(date_time_init),by="min") 

#Merge initial data with new time sequence
df2 <- merge(df1,xts(,date_time_complete))
                    df1
2017-06-02 03:10:20   1
2017-06-02 03:11:20  NA
2017-06-02 03:12:20  NA
2017-06-02 03:13:20   2
2017-06-02 03:14:20  NA
2017-06-02 03:15:20   3
2017-06-02 03:16:20  NA
2017-06-02 03:17:20  NA
2017-06-02 03:18:20   4

na.approx(df2)
                         df1
2017-06-02 03:07:24 1.000000
2017-06-02 03:08:24 1.333333
2017-06-02 03:09:24 1.666667
2017-06-02 03:10:24 2.000000
2017-06-02 03:11:24 2.500000
2017-06-02 03:12:24 3.000000
2017-06-02 03:13:24 3.333333
2017-06-02 03:14:24 3.666667
2017-06-02 03:15:24 4.000000

答案 1 :(得分:0)

让我们假设你a)知道如何从带有分号分隔符的文本文件中读取数据。我建议使用stringsAsFators=FALSE。并且b)知道如何使用paste将文本列连接起来。所以使用像

这样的数据框
> str(dat)
'data.frame':   35 obs. of  3 variables:
 $ Dates: chr  "02.01.11" "02.01.11" "02.01.11" "02.01.11" ...
 $ Times: chr  "11:00" "11:05" "11:10" "11:15" ...
 $ Vals : int  576 552 672 720 336 408 288 228 288 288 ...

可以使用基函数approxfun并将粘贴() - 日期和时间提供给as.POSIXct以形成解决方案的主干:

dat$Datetimes <- with(dat, as.POSIXct( paste(Dates,Times), format="%m.%d.%y %H:%M") )

现在创建一个新的数据帧,从一系列&#34;分钟点开始#34;用seq.POSIXct制作的时间范围:

dat2 <- data.frame(Mins = seq(min(dat$Datetimes), max(dat$Datetimes), by="1 min") )

然后使用形式approxfun( <inner args>)(<outer args>)的表达式在缺失的区间中进行线性插值。 approxfun会根据<inner-args>返回一个函数,其中包含&#34;分钟点数&#34;作为<outer-args>

给出
dat2$interp <- approxfun(dat$Datetimes, dat$Vals)(dat2$Mins)
str(dat2)
#----------
'data.frame':   171 obs. of  2 variables:
 $ Mins  : POSIXct, format: "2011-02-01 11:00:00" "2011-02-01 11:01:00" ...
 $ interp: num  576 571 566 562 557 ...

To&#34;见&#34;结果大小相同:

with(dat, plot(Datetimes,Vals,col="red") )
with(dat2, points(Mins,interp ,cex=0.2))

enter image description here