【问题标题】:How to interpolate data in R如何在 R 中插入数据
【发布时间】:2017-06-02 05:46:17
【问题描述】:

我是 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 分钟的时间范围内。 那么有人可以帮我找出如何插入“缺失”的值,以便它们适合当前的值吗?

我使用这个命令来获取数据框:

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)

【问题讨论】:

  • 看看?approx
  • 你需要知道如何读取数据文件吗?你知道 R 中的日期和时间对象吗?还是数据框?当有人说“我很新”时,如果他们不包含任何代码,就很难知道从哪里开始。
  • 好吧,我在一个数据框中有所有数据;我想通了,如何将 csv 文件中的数据转换为数据框。与列日期,时间和价值。但现在我需要给定值之间的“附加”值。这就是我卡住的地方。

标签: r


【解决方案1】:

为了处理分钟数据,我建议使用包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

【讨论】:

    【解决方案2】:

    假设您 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 并将 paste()-ed Dates&Times 给 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( &lt;inner args&gt;)(&lt;outer args&gt;) 在缺失的区间内进行线性插值。 approxfun 返回一个基于 &lt;inner-args&gt; 的函数,“分钟点”作为 &lt;outer-args&gt; 给出:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2014-03-22
      相关资源
      最近更新 更多