如何在R中将数据向后移动两个月?

4

我希望将我的所有数据整体往后移动两个月。 例如,如果我的数据从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 <- DF $ Date + 61,但这会将整个data.frame向后移动两个月,包括dates - 我只想要数据向下移动。


所以您想在DF的顶部留下2001-01-01,但数据为NA? - M.Viking
是的,没错。我也想在定义的时间段结束时截断数据。因为我的数据是为期三年的,而我们将以两个月的因子向下移动数据- 如果在那段时间内没有最后两个月的数据,我可以接受。 - Hydro
有人刚刚将这个问题与一个不回答我所寻找的内容的不同答案相关联,从而关闭了这个问题。 - Hydro
Hydro,我同意(自重新开放以来),虽然这并不重要...我认为你已经拥有了所需的内容,并且你能够接受答案。谢谢! - r2evans
1个回答

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)

谢谢,非常接近我想要的。我如何在我的指定日期结束时截断数据。如果我不获取最后两个月的数据也可以。现在,它超出了结束日期两个月。 - Hydro
一个简单的data.frame子集应该可以工作,例如out[ out$Date <= max(DF$Date),]。(或者更改为all.x=,请参见我的编辑。) - r2evans
dplyr 怎么样?这似乎也非常整洁。 - Hydro
1
使用 right_join 替代 full_join。如果您对 merge* _join 的概念不熟悉或不舒服,请建议您阅读以下答案:https://stackoverflow.com/q/448023和https://dev59.com/1nM_5IYBdhLWcg3wn0lO,因为一旦您掌握了足够的方法,它是非常强大和有用的。 - r2evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接