【问题标题】:R - Transforming data in dataframe from one time scale to anotherR - 将数据帧中的数据从一个时间尺度转换为另一个时间尺度
【发布时间】:2014-06-25 05:43:05
【问题描述】:

我目前有两个数据框,每个数据框都有一个日期列,然后是几列数字数据。第一个数据帧“每天”具有大约但不完全是每天的周期性数据,而第二个数据帧“每周”具有大约但不完全是每周的周期性数据。我想要完成的是将“每周”数据框替换为与“每日”具有相同日期的数据框,并用之前的值回填任何缺失值的数据。我知道我可以使用 zoo 包中的 na.locf 来回填数据,但我不确定如何有效地从“每日”数据框中引入日期。可能是合并或连接的一些变体?

样本数据:

daily<-data.frame(
    date1=rep(seq(as.Date("2000-01-01"), as.Date("2000-09-10"), by="1 day"), each=1),
    value1=runif(254),
    value2=rnorm(254), 
    value3=rpois(254,10)
)

weekly<-data.frame(
    date2=rep(seq(as.Date("2000-01-01"), as.Date("2000-09-10"), by="1 week"), each=1),
    value4=runif(37),
    value5=rnorm(37), 
    value6=rpois(37,10)
)

"result" should have date1 and then value4, value5, and value6 as columns and then na.locf can be used to backfill any missing data.

【问题讨论】:

  • 当然,听起来很合理。你能包括一些数据吗?见?dput。一些虚拟数据也可以工作。
  • @AndrewMacDonald 添加了虚拟数据。

标签: r dataframe time-series


【解决方案1】:

使用zoodplyr

library(dplyr)
library(zoo)

daily %>%
   left_join(weekly %>% 
               select(date1 = date2,value4:value6)) %>%
   mutate_each(funs(na.locf),value4:value6) %>%
   head  # obviously don't keep this last function! ;)
Joining by: "date1"
       date1     value1     value2 value3    value4   value5 value6
1 2000-01-01 0.01670715 -0.6526126      9 0.3648553 0.775517      8
2 2000-01-02 0.21580455 -0.7702071      9 0.3648553 0.775517      8
3 2000-01-03 0.16307286  1.1770171      9 0.3648553 0.775517      8
4 2000-01-04 0.91464458  1.5960920      9 0.3648553 0.775517      8
5 2000-01-05 0.13975950  1.4407381     13 0.3648553 0.775517      8
6 2000-01-06 0.75104455 -0.5890481     11 0.3648553 0.775517      8

注意使用select 重命名日期列,使其在两个数据集中相同。

【讨论】:

  • 效果很好。谢谢你。 %>% 是什么?
  • 我必须在您的代码中进行哪些更改以在结果数据框中仅包含 value4、value5 和 value6。换句话说,只有每周的数据列。
  • %&gt;% 是一个管道运算符,在dplyr 中用于将一个函数的输出移动到另一个函数中。它最初在包magrittr 中。见here
  • 你的意思是你想杀死列value1value3 而不删除重复的行?有很多方法; dplyr 方法是将末尾的 head 替换为 select(date1,value4:value6)
  • 谢谢你,还有一件事。假设我不知道 value4:value6 的名称是什么。有没有按列号做同样的事情,或者只是每周选择所有的列
【解决方案2】:

IIUC,使用data.tableroll 功能:

require(data.table) ## >= 1.9.2
setkey(setDT(daily), date1)
setkey(setDT(weekly), date2)
ans <- weekly[daily, roll=TRUE]

setDT - 通过引用将 data.frame 转换为 data.table(无副本)
setkey - 按该列对 data.table 进行排序(连接所需)
x[i, roll=TRUE] - 执行滚动连接

【讨论】:

  • 好,简洁的答案,但我想将我的数据保留为数据框而不是数据表。
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 2019-02-13
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多