R中使用全FALSE逻辑向量子集化tis对象列表时遇报错咨询
解决tis对象列表子集化时全FALSE逻辑向量触发报错的问题
我来帮你搞定这个tis包对象列表子集化时碰到的报错问题~先理清楚你的场景:当筛选条件返回全为FALSE的逻辑向量时,对列表里的tis对象做子集化就会弹出Error in if (!perhaps) return(FALSE) : missing value where TRUE/FALSE needed的错误,但单个tis对象做类似操作却没问题,这其实是因为列表中的tis对象在处理空结果时的内部逻辑和单个对象有差异。
问题根源
本质上,当你用全FALSE的向量去子集化tis对象时,程序会尝试创建一个空的tis对象,但tis包的内部函数在处理这种空对象时,有个条件判断需要有效的逻辑值,而空向量会导致这个判断失效,进而抛出错误。
解决方案:提前判断逻辑向量状态
我们可以在子集化之前先检查逻辑向量是否全为FALSE,如果是的话,返回一个符合tis结构的空对象(或者根据你的需求返回NULL),就能避开这个报错了。修改后的代码如下:
library(tis) library(dplyr) # 你的原始数据 myTis <- list(cbind(tis(1:10, start = c(2000, 1), freq = 12), tis(101:110, start = c(2000, 1), freq = 12)), cbind(tis(7:12, start = c(2000, 1), freq = 12), tis(107:112, start = c(2000, 1), freq = 12))) # 处理后的子集化逻辑 myTis_filtered <- myTis %>% lapply(function(x) { idx <- x[,1] < 7 # 检查是否全为FALSE if(all(!idx)) { # 返回匹配原对象时间属性的空tis对象 return(tis(numeric(0), start = start(x), freq = freq(x))) } else { x[idx, ] } })
其他处理tis对象子集化的实用方法
除了上面的修复方案,还有几种更贴合tis对象特性的子集化方式:
方法一:用
window()按时间范围筛选
如果你的筛选是基于时间区间,tis包自带的window()函数是更合适的选择,它专门为时间序列对象设计:# 筛选2000年1月到2000年6月的记录 myTis_windowed <- myTis %>% lapply(function(x) window(x, start = c(2000,1), end = c(2000,6)))方法二:转成data.frame处理复杂逻辑
要是你有更复杂的筛选规则,可以先把tis对象转成data.frame处理,完成后再转回tis对象:myTis_df_filtered <- myTis %>% lapply(function(x) { df <- as.data.frame(x) df_filtered <- df[df[,1] < 7, ] if(nrow(df_filtered) == 0) { tis(numeric(0), start = start(x), freq = freq(x)) } else { as.tis(df_filtered, start = start(x), freq = freq(x)) } })方法三:用
purrr::map()简化语法
如果你习惯tidyverse风格,可以用purrr包的map()替代lapply,语法更简洁:library(purrr) myTis_purrr <- myTis %>% map(function(x) { idx <- x[,1] < 7 if(all(!idx)) { tis(numeric(0), start = start(x), freq = freq(x)) } else { x[idx, ] } })
内容的提问来源于stack exchange,提问作者wtrs
相关产品推荐
相关产品推荐

