Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按日期合并数据帧生成NA_R_Date_Merge_Zoo_Posixlt - Fatal编程技术网

R 按日期合并数据帧生成NA

R 按日期合并数据帧生成NA,r,date,merge,zoo,posixlt,R,Date,Merge,Zoo,Posixlt,我正在学习R,目前正在尝试用缺失的日期和NA值填充数据框 数据样本: Date <- c("23-01-19", "24-01-19", "25-01-19", "30-01-19", "31-01-19" ) Open <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998") High <- c("69.849998", "69.440002", "69.540001", "70.32", "69.5

我正在学习R,目前正在尝试用缺失的日期和NA值填充数据框

数据样本:

Date <- c("23-01-19", "24-01-19", "25-01-19",  "30-01-19", "31-01-19" )
Open <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
High <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Low <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Close <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Adj_Close <- c("69.849998", "69.440002", "69.540001", "70.32", "69.559998")
Volume <- c("0", "0", "0", "0","0")

InvescoDf <- data.frame(Date, Open, High, Low, Close, Adj_Close, Volume)
我不知道如何将
complete
状态设置为
lappy

请提供帮助。

您可以将
日期
转换为日期对象,然后使用
完成
tidyr
填充缺少的日期

library(dplyr)
library(tidyr)

InvescoDf %>%
  mutate(Date = as.Date(Date, "%d-%m-%y")) %>%
  complete(Date = seq(min(Date), max(Date), by = "day"))

#  Date        Open  High   Low Close Adj_Close Volume
#  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>  <int>
#1 2019-01-23  69.8  69.8  69.8  69.8      69.8      0
#2 2019-01-24  69.4  69.4  69.4  69.4      69.4      0
#3 2019-01-25  69.5  69.5  69.5  69.5      69.5      0
#4 2019-01-26  NA    NA    NA    NA        NA       NA
#5 2019-01-27  NA    NA    NA    NA        NA       NA
#6 2019-01-28  NA    NA    NA    NA        NA       NA
#7 2019-01-29  NA    NA    NA    NA        NA       NA
#8 2019-01-30  70.3  70.3  70.3  70.3      70.3      0
#9 2019-01-31  69.6  69.6  69.6  69.6      69.6      0
库(dplyr)
图书馆(tidyr)
投资组合%>%
变异(日期=as.Date(日期,“%d-%m-%y”))%>%
完成(日期=序号(最短(日期),最长(日期),截止日期)
#日期开高关低调整关量
#                 
#1 2019-01-23  69.8  69.8  69.8  69.8      69.8      0
#2 2019-01-24  69.4  69.4  69.4  69.4      69.4      0
#3 2019-01-25  69.5  69.5  69.5  69.5      69.5      0
#4 2019-01-26不适用
#5 2019-01-27不适用
#6 2019-01-28不适用
#7 2019-01-29不适用
#8 2019-01-30  70.3  70.3  70.3  70.3      70.3      0
#9 2019-01-31  69.6  69.6  69.6  69.6      69.6      0

要对列表中的多个数据帧执行此操作,我们可以

new_list <- lapply(new_list, function(dat) {
    dat[[1]] <- as.Date(dat[[1]], "%d-%m-%y")
    # change the other variables to num 
    dat[-1] <- lapply(dat[-1],  function(x) as.numeric(as.character(x)))
    # complete the dates?
    dat <- complete(dat, Date = seq(min(Date), max(Date), by = "day"))
    #OR
    #dat <- complete(dat, Date = seq(min(dat[[1]]), max(dat[[1]]), by = "day"))
    dat
 })

新列表非常感谢!我可以用lappy在列表中的多个数据帧中进行迭代吗?@ToniR您的意思是,您有多个这样的数据帧,并且希望对所有这些数据帧使用相同的代码?是的,你可以使用
lappy
。我似乎不清楚,你正在使用mutate来更改变量,但我认为mutate创建了一个新变量。你能帮我理解吗?
mutate
如果数据中没有变量,则创建一个新变量。如果变量已经存在,则更改变量。@ToniR更新了答案,以便在列表中执行此操作。请查收。
library(dplyr)
library(tidyr)

InvescoDf %>%
  mutate(Date = as.Date(Date, "%d-%m-%y")) %>%
  complete(Date = seq(min(Date), max(Date), by = "day"))

#  Date        Open  High   Low Close Adj_Close Volume
#  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>  <int>
#1 2019-01-23  69.8  69.8  69.8  69.8      69.8      0
#2 2019-01-24  69.4  69.4  69.4  69.4      69.4      0
#3 2019-01-25  69.5  69.5  69.5  69.5      69.5      0
#4 2019-01-26  NA    NA    NA    NA        NA       NA
#5 2019-01-27  NA    NA    NA    NA        NA       NA
#6 2019-01-28  NA    NA    NA    NA        NA       NA
#7 2019-01-29  NA    NA    NA    NA        NA       NA
#8 2019-01-30  70.3  70.3  70.3  70.3      70.3      0
#9 2019-01-31  69.6  69.6  69.6  69.6      69.6      0
new_list <- lapply(new_list, function(dat) {
    dat[[1]] <- as.Date(dat[[1]], "%d-%m-%y")
    # change the other variables to num 
    dat[-1] <- lapply(dat[-1],  function(x) as.numeric(as.character(x)))
    # complete the dates?
    dat <- complete(dat, Date = seq(min(Date), max(Date), by = "day"))
    #OR
    #dat <- complete(dat, Date = seq(min(dat[[1]]), max(dat[[1]]), by = "day"))
    dat
 })
InvescoDf <- type.convert(InvescoDf)