Замените значения в кадре данных, сопоставив даты разной длины - PullRequest
0 голосов
/ 05 июля 2018

У меня 52 файла временных рядов различной длины для даты. Все они имеют одинаковую дату окончания - 31-01-2017, но все 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

когда 'data' короче, чем 'Simulated', и

 e.g.  replacement has 20819 rows, data has 22821

, когда «данные» длиннее, чем «Имитация».

Я попытался использовать left_join из пакета dplyr, но безуспешно, поскольку даты не совпадают между кадрами данных и данными.

library(dplyr)
df <-left_join(data, Simulated, by = c("Date"),all.x=TRUE)

Я отформатировал даты 'data' и 'Simulated', используя аналогично 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 голосов
/ 06 июля 2018

Решение может быть достигнуто с использованием 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

Данные:

simulated.txt

Date        1        2          3
01-01-1992  1.856    2.889      2.365
02-01-1993  1.523    3.536      4.624
03-01-1994  2.536    2.452      6.352    
04-01-1902  3.486    4.267      3.685


File1.txt

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

File2.txt

Date        FLOW     Modelled
01-01-1993  11.856    NA
02-01-1993  11.523    NA
03-01-1993  12.623    NA    
04-01-1993  13.679    NA

File3.txt

Date        FLOW     Modelled
01-01-1994  111.856    NA
02-01-1994  111.523    NA
03-01-1994  112.623    NA    
04-01-1994  113.679    NA
...