如何在 R 中将数据移动两个月?
How to shift data by a factor of two months in R?
我想将我的全部数据向下移动两个月。例如,如果我的数据从 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
- 我只是希望数据向下移动。
我认为与自身的简单合并在这里会奏效。
首先,您可以复制随机数据,
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)
我想将我的全部数据向下移动两个月。例如,如果我的数据从 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
- 我只是希望数据向下移动。
我认为与自身的简单合并在这里会奏效。
首先,您可以复制随机数据,
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)