使用rownames收集

时间:2018-06-07 00:55:08

标签: r dataframe dplyr rowname

我正在预测时间序列数据(使用行名称),并希望将一些准确度度量组合到单个数据帧中,同时区分方法。举个例子:

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

请注意this related question不回答我的。

1 个答案:

答案 0 :(得分:1)

使用purrr的{​​{1}}函数可以轻松完成此操作。

第一个技巧是预先定义所有测试方法函数并标记它们:

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