Как преобразовать неправильную таблицу с ложными днями для регулярного временного ряда? - PullRequest
0 голосов
/ 23 апреля 2020

У меня много таблиц с наблюдениями за климатом в суточной периодичности. Как видите все столбцы месяцев имеют 31 день. Я хочу правильно организовать эти данные, исключая все ложные дни и преобразовывать их в регулярные временные ряды.

просмотр данных: enter image description here

dput (head (data, 31)):

structure(list(NA. = 1:31, JAN = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
), FEV = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), MAR = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 12.5, 0), ABR = c(0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1.9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, NA), MAI = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 2.5, 0, 0, 0, 0, 0, 0, 1.8, 0, 0, 0), JUN = c(0, 
0, 0, 0, 0, 3.4, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 
0, 6.8, 2.4, 2.1, 0, 0, 0, 0, 0, NA), JUL = c(0, 0, 4.4, 0, 0, 
15.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.2, 0, 1.3, 0, 0, 1.7, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0), AGO = c(0, 0, 0, 0, 1.9, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.1, 4, 2.6, 0, 0, 
0, 0, 0), SET = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA), OUT = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), NOV = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.7, 0, 0, 0, 0, 0, 0, 
0, NA), DEZ = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 
31L), class = "data.frame")

Мне нравится этот пример:

enter image description here

исходные данные: https://www.dropbox.com/s/0xizr6fhbriieds/data.csv?dl=0

Пожалуйста, кто-нибудь, помогите мне. Для моего научного c посвящения.

1 Ответ

0 голосов
/ 23 апреля 2020

Из вашего вопроса не совсем ясно, как вы хотите фильтровать данные, но для преобразования в длинную форму и удаления NA s, один подход будет с dplyr, tidyr и lubridate. * 1005. *

Я использую data.table для загрузки ваших данных, потому что по какой-то причине они разделены точкой с запятой, хотя расширение файла .csv.

Возможно, вам не удастся переименовать месяцы с тех пор, как вы Местный, вероятно, принимает испанские sh сокращения месяца.

libary(data.table)
data <- fread("data.csv")
names(data) <- c("Day",month.abb)

library(dplyr)
library(tidyr)
library(lubridate)
Year <- 2000
data %>% 
  pivot_longer(-Day,names_to = "Month") %>%
  mutate(Date = dmy(paste(Day,Month,Year))) %>%
  filter(!is.na(value)) %>%
  select(Date,value)
#   Date       value
#   <date>     <dbl>
# 1 2000-07-03   4.4
# 2 2000-08-05   1.9
# 3 2000-06-06   3.4
# 4 2000-07-06  15.4
# 5 2000-04-12   1.9
# 6 2000-06-15   7  
# 7 2000-07-16   2.2
# 8 2000-07-18   1.3
# 9 2000-05-21   2.5
#10 2000-07-21   1.7
...