使用 R 中的 dplyr 使用早期的数据填充一行
Filling NA row using data from early date using dpylr in R
我有数据:
set.seed(2021)
sales <- round(runif(672, 10, 50), 0)
我想将销售数据作为新列添加到数据框中。我的数据框是这样的:
library(lubridate)
library(tidyr)
gen_month <- function(first_datex){
first_datex <- as.Date(first_datex)
last_datex <- ceiling_date(first_datex, 'month') - 1
expand_grid(datex = seq(first_datex, last_datex, by = 'day'), hourx = 0:23)
}
mydata <- gen_month("2021-03-01")
作为示例,我使用三月作为我的数据。所以我们结合mydata和sales.
set.seed(2021)
sales <- c(sales, rep(NA,72))
df <- data.frame(mydata, sales)
#tail(df)
# datex hourx sales
#739 2021-03-31 18 NA
#740 2021-03-31 19 NA
#741 2021-03-31 20 NA
#742 2021-03-31 21 NA
#743 2021-03-31 22 NA
#744 2021-03-31 23 NA
但是,由于sales数据的长度小于mydata,我们使用df的早期数据填充3月的NA数据。我希望的输出是:
df <- data.frame(mydata, sales2 = c(sales, sales[1:72]))
# head(df,72) & tail(df,72) should be same.
我的问题是
- 我们如何自动化这个过程?
- 如果sales数据的长度超过了mydata,我们需要对sales数据进行裁剪,使其适合mydata。我的第一个问题可以变成唯一的解决方案吗?
非常感谢。
您可以根据 mydata
中的行数对 sales
数据进行子集化。
mydata$sales <- sales[1:nrow(mydata)]
我们也可以
mydata$sales <- sales[seq_len(nrow(mydata))]
我有数据:
set.seed(2021)
sales <- round(runif(672, 10, 50), 0)
我想将销售数据作为新列添加到数据框中。我的数据框是这样的:
library(lubridate)
library(tidyr)
gen_month <- function(first_datex){
first_datex <- as.Date(first_datex)
last_datex <- ceiling_date(first_datex, 'month') - 1
expand_grid(datex = seq(first_datex, last_datex, by = 'day'), hourx = 0:23)
}
mydata <- gen_month("2021-03-01")
作为示例,我使用三月作为我的数据。所以我们结合mydata和sales.
set.seed(2021)
sales <- c(sales, rep(NA,72))
df <- data.frame(mydata, sales)
#tail(df)
# datex hourx sales
#739 2021-03-31 18 NA
#740 2021-03-31 19 NA
#741 2021-03-31 20 NA
#742 2021-03-31 21 NA
#743 2021-03-31 22 NA
#744 2021-03-31 23 NA
但是,由于sales数据的长度小于mydata,我们使用df的早期数据填充3月的NA数据。我希望的输出是:
df <- data.frame(mydata, sales2 = c(sales, sales[1:72]))
# head(df,72) & tail(df,72) should be same.
我的问题是
- 我们如何自动化这个过程?
- 如果sales数据的长度超过了mydata,我们需要对sales数据进行裁剪,使其适合mydata。我的第一个问题可以变成唯一的解决方案吗?
非常感谢。
您可以根据 mydata
中的行数对 sales
数据进行子集化。
mydata$sales <- sales[1:nrow(mydata)]
我们也可以
mydata$sales <- sales[seq_len(nrow(mydata))]