使用行名收集
Gather using rownames
我正在预测时间序列数据(使用行名称),并希望将一些准确性度量组合到一个数据框中,同时区分方法。例如:
library(fpp2)
beer.train <- window(beer, end = c(1994, 12))
beer.test <- window(beer, start = 1995)
AccMean <- accuracy(meanf(beer.train, h = 8), beer.test)
AccRW <- accuracy(rwf(beer.train, h = 8), beer.test)
rbind(AccMean, AccRW)
# ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# Training set -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# Test set -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# Training set 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# Test set -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
但是,我希望看到如下输出:
# Method Set ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# Mean Train -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# Mean Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# RW Train 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# RW Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
一种方法是执行以下操作:
AccMean <- AccMean %>% as.data.frame() %>% mutate(Method = "Mean", Set = c("Train", "Test")) %>% select(Method, Set, everything())
AccRW <- AccRW %>% as.data.frame() %>% mutate(Method = "RW", Set = c("Train", "Test")) %>% select(Method, Set, everything())
rbind(AccRW, AccMean)
# Method Set ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# 1 Mean Train -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# 2 Mean Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# 3 RW Train 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# 4 RW Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
但是我想将其概括为 n
方法,以上内容对于大型 n
来说会很乏味。我想使用 gather()
会有所帮助,但我似乎无法让它与 row.names
一起使用。
请注意 没有回答我的问题。
这可以使用 purrr
的 imap
函数轻松完成。
第一个技巧是预先定义所有测试方法函数并标记它们:
# define and label test methods
test_methods <- list(
Mean = meanf,
RW = rwf
)
然后,我们让 imap_dfr
做有趣的事情 - 将每个函数应用于数据、重新格式化、标记,然后将它们绑定在一起
library(purrr)
result_df <- imap_dfr(test_methods, function(f, .method) {
tmp <- accuracy(f(beer.train, h = 8), beer.test)
tmp %>%
as.data.frame() %>%
mutate(
Set = str_extract(rownames(tmp), "Train|Test"),
Method = .method
) %>%
select(Method, Set, everything())
})
我们使用 imap
因为它会自动将函数中的第二个变量(这里是 .method
)设置为我们列表中的名称(例如 test_methods
中的名称)。这正是这里所需要的。
更新
要向函数调用添加参数,我们需要将该信息合并到测试方法中。例如:
test_methods <- list(
Mean = meanf,
RW = rwf,
RWdrift = function(x, ...) rwf(x, drift = TRUE, ...)
)
需要点符号,因为 h=8
被硬编码到函数调用中。如果 h
也不同,您需要将其从 imap_dfr
中的调用中删除,并在所有 test_methods
条目中指定它:
test_methods <- list(
Mean08 = function(x) meanf(x, h = 8),
Mean10 = function(x) meanf(x, h = 10),
RW8 = function(x) rwf(x, h = 8,
RWdrift8 = function(x, ...) rwf(x, h = 8, drift = TRUE, ...)
)
我正在预测时间序列数据(使用行名称),并希望将一些准确性度量组合到一个数据框中,同时区分方法。例如:
library(fpp2)
beer.train <- window(beer, end = c(1994, 12))
beer.test <- window(beer, start = 1995)
AccMean <- accuracy(meanf(beer.train, h = 8), beer.test)
AccRW <- accuracy(rwf(beer.train, h = 8), beer.test)
rbind(AccMean, AccRW)
# ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# Training set -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# Test set -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# Training set 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# Test set -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
但是,我希望看到如下输出:
# Method Set ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# Mean Train -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# Mean Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# RW Train 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# RW Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
一种方法是执行以下操作:
AccMean <- AccMean %>% as.data.frame() %>% mutate(Method = "Mean", Set = c("Train", "Test")) %>% select(Method, Set, everything())
AccRW <- AccRW %>% as.data.frame() %>% mutate(Method = "RW", Set = c("Train", "Test")) %>% select(Method, Set, everything())
rbind(AccRW, AccMean)
# Method Set ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
# 1 Mean Train -9.474373e-15 19.82001 15.97396 -1.6202496 10.42125 1.726914 0.4628439 NA
# 2 Mean Test -1.289583e+01 17.57100 13.57292 -10.1596449 10.60310 1.467342 -0.4904015 0.7998411
# 3 RW Train 3.829787e-01 20.18004 15.14894 -0.6398801 10.05885 1.637723 -0.1547700 NA
# 4 RW Test -4.375000e+01 45.34865 43.75000 -32.6470928 32.64709 4.729730 -0.4904015 2.0312792
但是我想将其概括为 n
方法,以上内容对于大型 n
来说会很乏味。我想使用 gather()
会有所帮助,但我似乎无法让它与 row.names
一起使用。
请注意
这可以使用 purrr
的 imap
函数轻松完成。
第一个技巧是预先定义所有测试方法函数并标记它们:
# define and label test methods
test_methods <- list(
Mean = meanf,
RW = rwf
)
然后,我们让 imap_dfr
做有趣的事情 - 将每个函数应用于数据、重新格式化、标记,然后将它们绑定在一起
library(purrr)
result_df <- imap_dfr(test_methods, function(f, .method) {
tmp <- accuracy(f(beer.train, h = 8), beer.test)
tmp %>%
as.data.frame() %>%
mutate(
Set = str_extract(rownames(tmp), "Train|Test"),
Method = .method
) %>%
select(Method, Set, everything())
})
我们使用 imap
因为它会自动将函数中的第二个变量(这里是 .method
)设置为我们列表中的名称(例如 test_methods
中的名称)。这正是这里所需要的。
更新
要向函数调用添加参数,我们需要将该信息合并到测试方法中。例如:
test_methods <- list(
Mean = meanf,
RW = rwf,
RWdrift = function(x, ...) rwf(x, drift = TRUE, ...)
)
需要点符号,因为 h=8
被硬编码到函数调用中。如果 h
也不同,您需要将其从 imap_dfr
中的调用中删除,并在所有 test_methods
条目中指定它:
test_methods <- list(
Mean08 = function(x) meanf(x, h = 8),
Mean10 = function(x) meanf(x, h = 10),
RW8 = function(x) rwf(x, h = 8,
RWdrift8 = function(x, ...) rwf(x, h = 8, drift = TRUE, ...)
)