通过匹配不同长度的日期替换数据框中的值

时间:2018-07-05 16:02:48

标签: r date replace dplyr left-join

我有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

1 个答案:

答案 0 :(得分:0)

可以使用remark-breakstidyverse实现解决方案。首先从列表中的所有文件中读取所有数据帧,然后使用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