【问题标题】:resample a time series of a dataframe and use previous value for variables in R重新采样数据帧的时间序列并使用 R 中变量的先前值
【发布时间】:2020-05-04 13:43:39
【问题描述】:

我想合并两个具有不同时间戳的数据帧。数据来自具有不同频率的两个不同信号。数据框是这样的

df1 = data.frame(time = c(0.12, 0.21, 0.33, 0.42), 
             var1 = c(1, NA, 4, 6),
             var2 = c(4, 3, NA, 2))

df2 = data.frame(time = c(0.04, 0.08, 0.1, 0.12),
             var3 = c(2, 7, 5, 9))

如何合并这两个只有一个频率的数据帧?时间列应该看起来像

time = c(0.01, 0.02, 0.03, 0.04)

等等

如何重新采样我的数据,以便始终使用同一列的先前值?结果如下所示。

dfRes  = data.frame(time = c(0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 
                             0.09, 0.1, 0.11, 0.12, 0.13),
             var1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
             var2 = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
             var3 = c(2, 2, 2, 2, 2, 2, 2, 7, 7, 5, 5, 9, 9))

我认为 dfRes$var3 显示了这背后的想法。

我在后期的一些情节和机器学习算法中需要这个。 所以我不知道使用时间序列格式是否有意义。

提前致谢!

【问题讨论】:

  • “甚至将时间缩小到 100Hz (0.01)”是什么意思?你能解释一下吗?
  • 首先,很抱歉改变了我的问题。我没有看到答案,所以我稍微改变了问题。为了更好地理解,我再次编辑;)

标签: r dataframe variables time-series resampling


【解决方案1】:

基础 R 解决方案

inds <- which(is.na(df),arr.ind = TRUE)
df[inds] <- df[cbind(inds[,"row"]-1,inds[,"col"])]
df$time <- floor(10*df$time)/10

给了

> df
  time var1 var2
1  0.1    1    4
2  0.2    1    5
3  0.3    4    5
4  0.4    2    3
5  0.5    6    2
6  0.6    6    1

【讨论】:

    【解决方案2】:

    我们可以使用fill

    library(dplyr)
    library(tidyr)
    df %>%
         mutate(time = as.numeric(substr(time, 1, 3)) %>%
         fill(var1, var2)
    

    【讨论】:

    • fill简化了很多,+1!顺便说一句,round 似乎不是实现 OP 预期输出的好选择,可能更有可能从小数点后二位截断......
    • 是的,当然,每个人都可以免费使用:)
    • @ThomasIsCoding ii 将其更改为 substr 以实现多样性。谢谢
    • 这对我不起作用 :( 我收到一个错误“'fill'没有适用的方法......
    • @Bolle 你加载了tidyr 也可以查看packageVersion('tidyr')
    猜你喜欢
    • 2019-03-05
    • 2019-08-11
    • 1970-01-01
    • 2017-04-05
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多