我正在努力用矢量分析相当复杂的列表中的值。 它是一个列表,其中包含将ARIMA测试应用于多个时间序列的系数(=向量)。
这些系数向量可以为空(numeric(0)
),也可以是不同大小。一个例子:
> test <- list(numeric(0),c(ma1=0.7712434), c(ar1=0.6438842, ar2=-0.3112884))
> test
[[1]]
numeric(0)
[[2]]
ma1
0.7712434
[[3]]
ar1 ar2
0.6438842 -0.3112884
我希望能够轻松选择所有'ar'或'ar1'术语(根据名称选择)。我正在努力处理这个复杂的清单。所以我认为最简单的解决方案是将这个向量列表转换为单个向量(忽略空数字)。
对于上面的例子导致:
> c(ma1=0.7712434, ar1=0.6438842, ar2=-0.3112884)
ma1 ar1 ar2
0.7712434 0.6438842 -0.3112884
谁能帮助我?
注意: 我能够根据他们的名字来计算AR术语的数量,见下文。但我无法用它来提取这些术语的实际值。
tempFunName <- function(vec, name) { substr(names(vec),1,2) == name } # info on coef types
termType <- "ar" # all names starting with "ar"
sum(sapply(lapply(test, tempFunName, name=termType), sum, simplify=TRUE)) # all names starting with "ar"
答案 0 :(得分:2)
一种方法是:
unlist(test)[grep("^ar", names(unlist(test)))]
unlist()
只需将列表转换为矢量,然后我们可以通过grep
进行名称匹配的子集。 ^
表示在名称的开头搜索模式。
如果您想以列表形式保存输出,可以尝试:
lapply(test, function(x) x[grep("^ar", names(x))])
注意:为示例目的,我在示例数据中添加了一些变量。
test <- list(numeric(0),
c(ma1 = 0.7712434, star = .001),
c(ar1 = 0.6438842, ar2 = -0.3112884, par = 0.12345))
lapply(test, function(x) x[grep("ar", names(x))])
# [[1]]
# numeric(0)
#
# [[2]]
# star
# 0.001
#
# [[3]]
# ar1 ar2 par
# 0.6438842 -0.3112884 0.1234500
lapply(test, function(x) x[grep("^ar", names(x))])
# [[1]]
# numeric(0)
#
# [[2]]
# named numeric(0)
#
# [[3]]
# ar1 ar2
# 0.6438842 -0.3112884
unlist(lapply(test, function(x) x[grep("^ar", names(x))]))
# ar1 ar2
# 0.6438842 -0.3112884