有没有办法在r中用map或lapply命令传递时间序列数据的子集?

为了改进我的R编程并简化我的代码,我试图用 “lapply”、”map “或类似的变体替换 “for “循环。 我想使用时间序列数据中的2分钟时间间隔来执行一个函数。 当我尝试使用函数’map’或’lapply’来传递数据的一个子集时,我得到了一个’subscript out of bounds错误’。 有什么好办法吗?

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]))

解决方案:

我们可以在序列上循环,然后 paste 如同 for

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  

给TA打赏
共{{data.count}}人
人已打赏
解决方案

BeanUtils过滤器 基于对象属性和值比较的设置

2022-5-14 15:00:32

解决方案

当应用函数将整数数据框转换为十进制时,返回因子。

2022-5-14 15:00:34

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索