【问题标题】:How to shift data by a factor of two months in R?如何在R中将数据移动两个月?
【发布时间】:2020-03-20 16:34:48
【问题描述】:

我想将我的整个数据下移两个月。例如,如果我的数据从 1 月 1 日开始,我希望以数据对应于 3 月 1 日的方式移动数据。同样,11 月的数据将成为下一年的 1 月数据。这是我的示例代码

DF <- data.frame(seq(as.Date("2001-01-01"), to= as.Date("2003-12-31"), by="day"),
                     A = runif(1095, 0,10),
                     D = runif(1095,5,15))
colnames(DF) <-  c("Date", "A", "B")

我尝试了DF$Date &lt;- DF$Date + 61,但这将整个data.frame 移动了两个月,包括dates- 我只是希望数据向下移动。

【问题讨论】:

  • 所以您想将 2001-01-01... 留在 DF 的顶部,但使用 NA 表示数据?
  • 是的,完全正确。我还想在定义的时间段结束时截断数据。因为我的数据是 3 年的数据,而且我们将数据向下移动了两个月 - 如果在此期间我没有过去两个月的数据,我可以。
  • 有人刚刚结束了这个问题,将它与一个不同的答案相关联,这个答案不能回答我正在寻找的东西。
  • Hydro,我同意(重新打开后),尽管这并不重要......我认为你有你需要的东西,并且你能够接受答案。谢谢!

标签: r dataframe date reshape2


【解决方案1】:

我认为与自身的简单合并在这里可以工作。

首先,您可以重现的随机数据,

headtail <- function(x, n = 4) { print(head(x, n=n)); print(tail(x, n=n)); }

set.seed(42)
DF <- data.frame(seq(as.Date("2001-01-01"), to= as.Date("2003-12-31"), by="day"),
                     A = runif(1095, 0,10),
                     D = runif(1095,5,15))
colnames(DF) <-  c("Date", "A", "B")
headtail(DF)
#         Date        A         B
# 1 2001-01-01 9.148060 10.049361
# 2 2001-01-02 9.370754 10.324953
# 3 2001-01-03 2.861395  5.868702
# 4 2001-01-04 8.304476 14.156014
#            Date         A         B
# 1092 2003-12-28 0.3284422  6.449250
# 1093 2003-12-29 7.7729724  7.270769
# 1094 2003-12-30 5.2614178 11.023033
# 1095 2003-12-31 2.6612188 13.923079

现在合并。我只在第一帧上使用Date,这样移动后的Date 将附加第二帧的数据。

out <- merge(DF["Date"], transform(DF, Date = Date + 61),
             by = "Date", all = TRUE)
headtail(out)
#         Date  A  B
# 1 2001-01-01 NA NA
# 2 2001-01-02 NA NA
# 3 2001-01-03 NA NA
# 4 2001-01-04 NA NA
#            Date         A         B
# 1153 2004-02-27 0.3284422  6.449250
# 1154 2004-02-28 7.7729724  7.270769
# 1155 2004-02-29 5.2614178 11.023033
# 1156 2004-03-01 2.6612188 13.923079

即保留所有数据。如果您只想到原始帧的最后一个日期,则只需将all= 更改为all.x=

out <- merge(DF["Date"], transform(DF, Date = Date + 61),
             by = "Date", all.x = TRUE)
headtail(out)
#         Date  A  B
# 1 2001-01-01 NA NA
# 2 2001-01-02 NA NA
# 3 2001-01-03 NA NA
# 4 2001-01-04 NA NA
#            Date         A         B
# 1092 2003-12-28 9.7939015 14.165207
# 1093 2003-12-29 1.7047221  8.269991
# 1094 2003-12-30 0.4273437  8.041551
# 1095 2003-12-31 1.4283236  5.053276

dplyr

library(dplyr)
as_tibble(DF) %>%
  mutate(Date = Date + 61) %>%
  full_join(., select(DF, Date), by = "Date") %>%
  arrange(Date)

【讨论】:

  • 谢谢,它非常接近我正在寻找的东西。我如何在我定义的日期结束时截断数据。如果我没有得到最近两个月的数据,我很好。现在,它比结束日期早了两个月。
  • 一个简单的data.frame 子集应该可以工作,例如out[ out$Date &lt;= max(DF$Date),]。 (或更改为all.x=,请参阅我的编辑。)
  • dplyr 怎么样?那看起来也很整洁。
  • 使用right_join 而不是full_join。如果您对merge*_join 的概念不熟悉/不熟悉,我建议您阅读以下位置的答案:stackoverflow.com/q/448023stackoverflow.com/q/1299871,因为一旦您掌握了足够的知识,这是一种非常强大且有用的方法.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多