2017-06-02 70 views
0

我很新至R Studio和我有一個問題:如何插值數據R中

我有以下數據:(日期,時間,價值)

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分鐘的時間。 那麼有人可以幫助我發現,我如何插入「缺失」的值,以便它們適合現在的?

我用這個命令來獲取數據框:

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) 
+0

看看'?approx'。 –

+0

你需要知道如何讀取數據文件嗎?你知道R中的日期和時間對象嗎?或數據框?當有人說「我很新」時,如果他們不包含任何代碼,很難知道從哪裏開始。 – Spacedman

+0

好吧,我有一個數據幀中的所有數據;我想到了這一點,如何從csv文件數據到數據框。與列日期,時間和價值。但是現在我需要給定的「額外」值。這是我卡住的地步。 – OnTheRunR

回答

0

爲了應對分鐘的數據,我會建議使用包xts,並從包zoo功能na.approx。簡而言之,您需要創建一個包含原始數據的分鐘數據的空向量,您將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 
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")) 

現在創建一個新的數據幀開始跨越時代的範圍內seq.POSIXct由「分點」的順序:

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

然後使用表格:approxfun(<inner args>)(<outer args>)在缺失的間隔中進行線性插值。 approxfun返回基於<inner-args>的功能,其中的「分點」給出的<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 ... 

「看」上同等規模的結果:

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

enter image description here