如何提取表中的参数模型?
How extract parameter model intable?
我正在尝试从 table 中提取不同的参数并将它们分别放在一列中。我试过了,但是没有用。
这是例子
Models = c("ARIMA(1,0,10)(80,0,90)[12] with non-zero mean",
"ARIMA(2,0,11) with non-zero mean",
"ARIMA(3,0,12)(81,0,91)[12] with non-zero mean",
"ARIMA(4,0,13)(82,0,92)[12] with non-zero mean",
"ARIMA(5,0,14) with zero mean",
"ARIMA(6,0,15) with non-zero mean")
Models = as.data.frame(Models)
我需要在不同的列中分隔每个参数
这个想法是将它分开如下
Name p d q P D Q PERIOD MEAN
1 ARIMA 1 0 10 80 0 90 12 with non-zero mean
2 ARIMA 2 0 11 N/a N/a N/a N/a with non-zero mean
3 ARIMA 3 0 12 81 0 91 12 with non-zero mean
4 ARIMA 4 0 13 82 0 92 12 with non-zero mean
5 ARIMA 5 0 14 N/a N/a N/a N/a with zero mean
6 ARIMA 6 0 15 N/a N/a N/a N/a with non-zero mean
有没有办法自动分离?
我是 R 的新手,我研究过但找不到解决方案
注意:示例中的模型不是真实的,只是为了识别参数
我认为您将不得不自己构建一些东西。首先,尝试(*从 Models
的 字符向量 版本开始,即在转换为数据框之前 - 或者,如果您已经有数据框,请使用 Models[[1]]
而不是第一步中的 Models
。
m <- gsub("with (.*) mean","with_\1_mean",Models)
mm <- strsplit(m, "[(), ]")
这首先将“with zero/non-zero mean”中的空格转换为下划线,然后在集合 (),
.
中找到字符的任何地方拆分字符串
您可以使用 lengths(mm)
来判断 P/D/Q/period 是否存在(如果存在则值为 10,否则为 6)。像
这样笨重的东西
insert_na <- function(x) c(x[1:5], rep(NA,4), x[6])
mm[lengths(mm)==6] <- lapply(mm[lengths(mm==6)], insert_na)
可能有用,虽然我还没有测试过。
在正确的位置插入 NA 值后,您可以执行类似
的操作
do.call(rbind,mm[sapply(mm, length) == 10])
将它们放在一起(这里我子集只包括长度为 10 的值)。然后你可能想把结果变成一个数据框,并将适当的列转换为数字......还有其他清理工作要做(删除虚假字符,添加列名等)
我不确定它在您的原始数据集上的表现如何,但在这里似乎工作正常:
library(dplyr)
library(stringr)
library(tidyr)
Models %>%
as_tibble() %>%
mutate(Mean = str_extract(value, "(?<=\s)[^d]+"),
value = gsub("\s[^d]+", "", value),
value = gsub("[)(,]", " ", value, perl = TRUE),
value = gsub("[\[\]]", "", value, perl = TRUE)) %>%
separate(value, into = c("Name", "p", "d", "q", "P", "D", "Q", "Period"), sep = "\s+") %>%
mutate(across(p:Q, ~ replace(., . == (""), NA)))
# A tibble: 6 x 9
Name p d q P D Q Period Mean
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 ARIMA 1 0 10 80 0 90 12 with non-zero mean
2 ARIMA 2 0 11 NA NA NA NA with non-zero mean
3 ARIMA 3 0 12 81 0 91 12 with non-zero mean
4 ARIMA 4 0 13 82 0 92 12 with non-zero mean
5 ARIMA 5 0 14 NA NA NA NA with zero mean
6 ARIMA 6 0 15 NA NA NA NA with non-zero mean
我正在尝试从 table 中提取不同的参数并将它们分别放在一列中。我试过了,但是没有用。
这是例子
Models = c("ARIMA(1,0,10)(80,0,90)[12] with non-zero mean",
"ARIMA(2,0,11) with non-zero mean",
"ARIMA(3,0,12)(81,0,91)[12] with non-zero mean",
"ARIMA(4,0,13)(82,0,92)[12] with non-zero mean",
"ARIMA(5,0,14) with zero mean",
"ARIMA(6,0,15) with non-zero mean")
Models = as.data.frame(Models)
我需要在不同的列中分隔每个参数 这个想法是将它分开如下
Name p d q P D Q PERIOD MEAN
1 ARIMA 1 0 10 80 0 90 12 with non-zero mean
2 ARIMA 2 0 11 N/a N/a N/a N/a with non-zero mean
3 ARIMA 3 0 12 81 0 91 12 with non-zero mean
4 ARIMA 4 0 13 82 0 92 12 with non-zero mean
5 ARIMA 5 0 14 N/a N/a N/a N/a with zero mean
6 ARIMA 6 0 15 N/a N/a N/a N/a with non-zero mean
有没有办法自动分离? 我是 R 的新手,我研究过但找不到解决方案
注意:示例中的模型不是真实的,只是为了识别参数
我认为您将不得不自己构建一些东西。首先,尝试(*从 Models
的 字符向量 版本开始,即在转换为数据框之前 - 或者,如果您已经有数据框,请使用 Models[[1]]
而不是第一步中的 Models
。
m <- gsub("with (.*) mean","with_\1_mean",Models)
mm <- strsplit(m, "[(), ]")
这首先将“with zero/non-zero mean”中的空格转换为下划线,然后在集合 (),
.
您可以使用 lengths(mm)
来判断 P/D/Q/period 是否存在(如果存在则值为 10,否则为 6)。像
insert_na <- function(x) c(x[1:5], rep(NA,4), x[6])
mm[lengths(mm)==6] <- lapply(mm[lengths(mm==6)], insert_na)
可能有用,虽然我还没有测试过。
在正确的位置插入 NA 值后,您可以执行类似
的操作do.call(rbind,mm[sapply(mm, length) == 10])
将它们放在一起(这里我子集只包括长度为 10 的值)。然后你可能想把结果变成一个数据框,并将适当的列转换为数字......还有其他清理工作要做(删除虚假字符,添加列名等)
我不确定它在您的原始数据集上的表现如何,但在这里似乎工作正常:
library(dplyr)
library(stringr)
library(tidyr)
Models %>%
as_tibble() %>%
mutate(Mean = str_extract(value, "(?<=\s)[^d]+"),
value = gsub("\s[^d]+", "", value),
value = gsub("[)(,]", " ", value, perl = TRUE),
value = gsub("[\[\]]", "", value, perl = TRUE)) %>%
separate(value, into = c("Name", "p", "d", "q", "P", "D", "Q", "Period"), sep = "\s+") %>%
mutate(across(p:Q, ~ replace(., . == (""), NA)))
# A tibble: 6 x 9
Name p d q P D Q Period Mean
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 ARIMA 1 0 10 80 0 90 12 with non-zero mean
2 ARIMA 2 0 11 NA NA NA NA with non-zero mean
3 ARIMA 3 0 12 81 0 91 12 with non-zero mean
4 ARIMA 4 0 13 82 0 92 12 with non-zero mean
5 ARIMA 5 0 14 NA NA NA NA with zero mean
6 ARIMA 6 0 15 NA NA NA NA with non-zero mean