Есть ли способ передать подмножество данных временных рядов с помощью команды map или lapply в r? - PullRequest
1 голос
/ 23 апреля 2020

Чтобы улучшить мое R-программирование и упростить мой код, я пытаюсь заменить 'для' l oop на 'lapply', 'map' или подобный вариант. Я хочу выполнить функцию, используя 2-минутные интервалы времени из моих данных временных рядов. Когда я пытаюсь передать только подмножество данных, используя один из функционалов, «map» или «lapply», я получаю «ошибка индекса за пределами границ». Есть идеи?

library(lubridate)
library(purrr)
library(stats)
library(xts)
# Set up the time series data
t <- ymd_hms("2020-01-01 08:00:00","2020-01-01 08:01:00","2020-01-01 08:02:00", "2020-01-01 08:03:00")
tsData <- as.xts(1:4,order.by=(t))
# Set up the summary time periods; in this case every 2 minutes
timeSlots <- seq(from=t[1],to=t[length(t)],by=120)
# Make sure it also summarizes the last period
lastTime <- stats::time(tsData[nrow(tsData)])

# The next 4 lines iterate through the time series and print a summary for each 2 minute time period; 
# This is the loop I want to replace with 'map'
for (i in 1:(length(timeSlots))) {
  if (i < length(timeSlots)) {
    print (summary (tsData[paste(timeSlots[i],'/',(timeSlots[i+1]-1),sep='')]))
  }
# This makes sure the last subset includes the last observation
  else print (summary (tsData[paste(timeSlots[i],'/',lastTime,sep='')]))
}

# This next statement gets a subscript out of bounds error
lapply (timeSlots, function(x) summary(tsData[x:x+1]))

# This next statement gets a subscript out of bounds error
map (timeSlots,function(x) summary(tsData[x:x+1]))

1 Ответ

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

Мы можем l oop по последовательности и paste, как в for l oop

library(xts)
lapply(seq_along(timeSlots), function(i) 
   if(i < length(timeSlots)) {
    summary(tsData[paste(timeSlots[i], timeSlots[i+1]-1, sep="/")])

   } else {
       summary (tsData[paste(timeSlots[i],'/',lastTime,sep='')])
       }

    )

#[[1]]
#     Index                     tsData[paste(timeSlots[i], timeSlots[i + 1] - 1, sep = "/")]
# Min.   :2020-01-01 08:00:00   Min.   :1.00                                                
# 1st Qu.:2020-01-01 08:00:15   1st Qu.:1.25                                                
# Median :2020-01-01 08:00:30   Median :1.50                                                
# Mean   :2020-01-01 08:00:30   Mean   :1.50                                                
# 3rd Qu.:2020-01-01 08:00:45   3rd Qu.:1.75                                                
# Max.   :2020-01-01 08:01:00   Max.   :2.00                                                

#[[2]]
#     Index                     tsData[paste(timeSlots[i], "/", lastTime, sep = "")]
# Min.   :2020-01-01 08:02:00   Min.   :3.00                                        
# 1st Qu.:2020-01-01 08:02:15   1st Qu.:3.25                                        
# Median :2020-01-01 08:02:30   Median :3.50                                        
# Mean   :2020-01-01 08:02:30   Mean   :3.50                                        
# 3rd Qu.:2020-01-01 08:02:45   3rd Qu.:3.75                                        
# Max.   :2020-01-01 08:03:00   Max.   :4.00  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...