R - Выбрать файлы по дате в именах файлов

У меня уже был подобный вопрос здесь: R - Как выбирать файлы по датам в именах файлов?

Но я должен сделать небольшое изменение.

У меня все еще есть список имен файлов, похожий на этот:

list = c("AT0ACH10000700100dymax.1-1-1993.31-12-2003",
         "AT0ILL10000700500dymax.1-1-1990.31-12-2011", 
         "AT0PIL10000700500dymax.1-1-1992.31-12-2011",
         "AT0SON10000700100dymax.1-1-1990.31-12-2011",
         "AT0STO10000700100dymax.1-1-1992.31-12-2006",  
         "AT0VOR10000700500dymax.1-1-1981.31-12-2011",
         "AT110020000700100dymax.1-1-1993.31-12-2001",
         "AT2HE190000700100dymax.1-1-1973.31-12-1994", 
         "AT2KA110000700500dymax.1-1-1991.31-12-2010", 
         "AT2KA410000700500dymax.1-1-1991.31-12-2011")

У меня уже есть команда для сортировки файлов определенной длины записи (например, 10 в данном случае):

#Listing Files (creates the list above)
files = list.files(pattern="*00007.*dymax", recursive = TRUE)

#Making date readable
split_daymax = strsplit(files, split=".", fixed=TRUE)

from = unlist(lapply(split_daymax, "[[", 2))
to = unlist(lapply(split_daymax, "[[", 3))
from = as.POSIXct(from, format="%d-%m-%Y")
to = as.POSIXct(to, format="%d-%m-%Y")

timelistmax = difftime(to, from, "days")

#Files with more than 10 years of recording
index = timelistmax >= 10*360
filesdaymean = filesdaymean[index]

Моя проблема в том, что у меня слишком много файлов, и ни один компьютер не может с этим справиться.

Теперь я хочу читать только те файлы, которые содержат файлы с 1993 года (или любого другого определенного года, который я хочу) и с тех пор иметь 10-летнюю запись, поэтому записи должны быть как минимум до 2003 года.

Так что файл 1973-1994 не стоит включать, а вот файл 1981-2011 вполне подойдет.

Я не знаю, как выбрать год в этом случае.

Я благодарен за любую помощь


person Essi    schedule 10.01.2018    source источник
comment
1973-1994 более 10 лет   -  person akrun    schedule 10.01.2018
comment
Конечно, не менее 10 лет! Может быть и больше. Но 1973-1994 год не годится, потому что меня интересует время с 1993 по 2003 год. И этот файл содержит только 1 год в этом периоде. Извините, когда это было неясно. Мне нужны файлы, содержащие 1993-2003 годы. Я хочу исключить файлы, подобные упомянутому, потому что в этом периоде всего 1 год, и мне нужны только файлы, которым не менее 10 лет. Так что 1993-2010 или около того тоже подойдет.   -  person Essi    schedule 10.01.2018
comment
Я думаю, вам, возможно, придется упомянуть, что оно должно быть кратно 10 или 10.   -  person akrun    schedule 10.01.2018
comment
Что ты имеешь в виду?   -  person Essi    schedule 10.01.2018
comment
Кстати, в list, который вы указали, вы хотите выбрать только 1, 6 и 10? В этом случае list[!sapply(stringr::str_extract_all(list, "(?<=-)[0-9]{4}"), function(x) diff(as.numeric(x))) %% 10 ]#[1] "AT0ACH10000700100dymax.1-1-1993.31-12-2003" "AT0VOR10000700500dymax.1-1-1981.31-12-2011" [3] "AT2KA410000700500dymax.1-1-1991.31-12-2011" `   -  person akrun    schedule 10.01.2018
comment
Нет! Я хочу иметь все, кроме 6 и 7! Смотрите: меня интересуют годы с 1993 по 2003 год. Так что 2-й файл, например, тоже хорош тем, что содержит это время. Я могу просто вырезать годы, которые мне не интересны. Например, 6-й файл слишком короткий. Он начинается в 1993 году, и это нормально, но он уже заканчивается в 2001 году, так что 2 года отсутствуют, что не так.   -  person Essi    schedule 10.01.2018
comment
Извините, я не улавливаю логику   -  person akrun    schedule 10.01.2018
comment
Хм, я не знаю, что в этом сложного. :/ Я хочу, чтобы файлы содержали годы с 1993 по 2003 год, не короче, а длиннее - это не проблема!   -  person Essi    schedule 10.01.2018
comment
Как я уже сказал, я не понял вашей логики. Основываясь на ранее упомянутой вами логике, я показал код, а вы говорите, что все, кроме 6 и 7, которые я не понимаю, по какой логике это.   -  person akrun    schedule 10.01.2018


Ответы (2)


library(stringr)
library(lubridate)
fileDates <- str_extract_all(files, "[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}")

find_file <- function(x, whichYear, noYears = 10) {
  start <- as.Date(x[[1]], "%d-%m-%Y")
  end <- as.Date(x[[2]], "%d-%m-%Y")
  years <- as.numeric(end-whichYear, units = "days")/365
  years > noYears & (year(start) <= year(whichYear) & 
                       year(end) >= year(whichYear))
}
sapply(fileDates, find_file, whichYear = as.Date("1993-01-01"), noYears = 10)

У вас есть два условия, которые вы можете вычислить: сначала количество лет, прошедших с 1993 года, а затем использовать логическую логику, чтобы выяснить, находится ли 1993 год в пределах диапазона дат.

person troh    schedule 10.01.2018
comment
Благодарю вас! Это сработало, и я получил желаемый результат! - person Essi; 10.01.2018

Используя files, to и from, как вы определили их выше, вы должны получить файлы, содержащие как минимум десятилетний период данных между 1993 и 2003 годами:

library(lubridate)
df <- data.frame(file_name = files, file_start = from, file_end = to)
df_index <- year(df$file_start) <=1993 & year(df$file_end) >= 2003
files_to_load <- df$file_name[df_index]

Если требуется только базовое решение, измените POSIXct на POSIXlt и извлеките компонент года как таковой:

df <- data.frame(file_name = files, 
                 file_start = as.POSIXlt(from), 
                 file_end = as.POSIXlt(to))

df_index <- (df$file_start$year+1900 <=1993 & 
             df$file_end$year+1900  >= 2003)

files_to_load <- df$file_name[df_index]
person icj    schedule 10.01.2018
comment
Я получаю сообщение об ошибке "Ошибка года" (df$file_start): не удалось найти год функции. - person Essi; 10.01.2018
comment
Блин, пропустил звонок в библиотеку смазки. отредактировано сейчас. Спасибо за внимание. - person icj; 10.01.2018