R - 使用逻辑向量

时间:2018-01-24 15:03:53

标签: r boolean time-series subset lapply

我想在R中对tis对象的列表进行子集化,但每当我尝试使用包含所有FALSE条目的逻辑向量进行子集时,我都会遇到错误。

例如,给定tis对象myTis:

library(tis)
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的第一列大于11的所有元素的所有行,那么这很容易做到:

myTis %>% lapply(function(x) x[x[,1] < 11,])

但是当我尝试将其子集为一个排除其中一个tis对象的所有元素的值时,我得到以下错误:“if(!或许)返回错误(FALSE):缺少值需要TRUE / FALSE“。例如,运行此行会导致该错误:

myTis %>% lapply(function(x) x[x[,1] < 7,])

值得注意的是,当我尝试使用单个tis对象执行类似操作时,我没有收到错误:

myTis[myTis[[1]][,1] > 10]

我也对使用tis对象完全不同的方式持开放态度。

1 个答案:

答案 0 :(得分:1)

原因是在list个元素之一中,逻辑向量全部为FALSE。可能我们需要创建一个if/else条件来返回原始tis对象,或者可能是NA(在代码中,我们指定.x即原始对象)

library(purrr)
myTis %>% 
    map(~  if(!any(.x[,1]< 7)) .x else .x[.x[,1] < 7,])