我有52个时间序列文件,它们的日期长度不同。所有日期都有相同的结束日期-2017年1月31日,但是所有52个数据框的开始日期都不同。
“数据”:nRows
Date FLOW Modelled
01-01-1992 1.856 NA
02-01-1992 1.523 NA
03-01-1992 2.623 NA
04-01-1992 3.679 NA
...
31-12-2017
我还有一个文件,其中包含列中每个数据集的模拟FLOW值。
“模拟”:20819行,53列(包括日期)。
Date 1 2 3 ..52
01-01-1961 1.856 2.889 2.365
02-01-1961 1.523 3.536 4.624
03-01-1961 2.536 2.452 6.352
04-01-1961 3.486 4.267 3.685
...
31-12-2017
我的问题是我想从模拟数据中选择每一列(例如,列1对应于“数据”文件1),并用模拟值填充“数据”的建模列。理想情况下,这将根据文件名列表遍历52个文件
我面临的问题是当使用left_join时出现的错误是
e.g. replacement has 20819 rows, data has 9657
“数据”比“模拟”短时,并且
e.g. replacement has 20819 rows, data has 22821
“数据”长于“模拟”时。
我尝试使用dplyr
包的left_join并没有运气,因为日期在'data'和'Simulated'数据帧中不匹配。
library(dplyr)
df <-left_join(data, Simulated, by = c("Date"),all.x=TRUE)
我已经使用类似于Simulated$Date <- as.Date(with(Simulated, paste(Year, Month, Day, sep="-")), "%Y-%m-%d")
的格式设置了“数据”和“模拟”日期。但是当我使用left_join时,仍然出现以下错误:
cannot join a Date object with an object that is not a Date object
答案 0 :(得分:0)
可以使用remark-breaks
和tidyverse
实现解决方案。首先从列表中的所有文件中读取所有数据帧,然后使用read.table
将它们合并到一个数据帧中。
dplyr::bind_rows
数据:
#Get the file list
filelist = list.files(path = ".", pattern = ".*.txt", full.names = TRUE)
# Read all files in a list
ll <- lapply(filelist, FUN=read.table, header=TRUE, stringsAsFactors = FALSE)
# Read data from file containing simulate data
simulated <- read.table(file = "simulated.txt", header=TRUE, stringsAsFactors = FALSE)
library(tidyverse)
#Convert simulated data to long format and then join with other dataframes
simulated %>% mutate(Date = as.Date(Date, format = "%d-%m-%Y")) %>%
gather(df_num, SIM_FLOW, -Date) %>%
mutate(df_num = gsub("X(\\d+)", "\\1", df_num)) %>%
right_join(bind_rows(ll, .id="df_num") %>% mutate(Date = as.Date(Date, format = "%d-%m-%Y")),
by=c("df_num", "Date"))
# Date df_num SIM_FLOW FLOW Modelled
# 1 1992-01-01 1 1.86 1.86 NA
# 2 1992-01-02 1 NA 1.52 NA
# 3 1992-01-03 1 NA 2.62 NA
# 4 1992-01-04 1 NA 3.68 NA
# 5 1993-01-01 2 NA 11.86 NA
# 6 1993-01-02 2 3.54 11.52 NA
# 7 1993-01-03 2 NA 12.62 NA
# 8 1993-01-04 2 NA 13.68 NA
# 9 1994-01-01 3 NA 111.86 NA
# 10 1994-01-02 3 NA 111.52 NA
# 11 1994-01-03 3 6.35 112.62 NA
# 12 1994-01-04 3 NA 113.68 NA