4

我正在为 R 中的重塑而苦苦挣扎。我有 2 种类型的错误(err 和 rel_err)已针对 3 个不同的模型进行了计算。这给了我总共 6 个错误变量(即 err_1、err_2、err_3、rel_err_1、rel_err_2 和 rel_err_3)。对于这些类型的错误中的每一种,我都有 3 种不同类型的预测有效性测试(即随机保留、回溯、预测)。我想让我的数据集很长,所以我保持 4 种类型的测试很长,同时也让两个错误测量很长。所以最后我将有一个名为 err 的变量和一个名为 rel_err 的变量,以及一个用于错误对应的模型的 id 变量(1、2 或 3)

这是我现在的数据:

iter       err_1  rel_err_1      err_2  rel_err_2      err_3  rel_err_3 test_type
1 -0.09385732 -0.2235443 -0.1216982 -0.2898543 -0.1058366 -0.2520759    random
1  0.16141630  0.8575728  0.1418732  0.7537442  0.1584816  0.8419816    back
1  0.16376930  0.8700738  0.1431505  0.7605302  0.1596502  0.8481901    front
1  0.14345986  0.6765194  0.1213689  0.5723444  0.1374676  0.6482615    random
1  0.15890059  0.7435382  0.1589823  0.7439204  0.1608709  0.7527580    back
1  0.14412360  0.6743928  0.1442039  0.6747684  0.1463520  0.6848202    front

这就是我希望它的样子:

iter     model    err           rel_err    test_type
1        1        -0.09385732    (#'s)     random
1        2        -0.1216982     (#'s)     random
1        3        -0.1216982     (#'s)     random

然后……

我已经尝试过使用语法,但无法完全弄清楚 time.variing 参数应该放什么

非常感谢您提供的任何帮助。

4

2 回答 2

5

你可以用“硬”的方式来做。为了透明度,您可以使用名称。

with( dat, data.frame(iter = rep(iter, 3), 
      model = rep(1:3, each = nrow(dat)),
      err = c(err_1, err_2, err_3), 
      rel_err = c(rel_err_1, rel_err_2, rel_err_3), 
      test_type = rep(test_type, 3)) )

或者,为了简洁,索引。

data.frame(iter = dat[,1], model = rep(1:3, each = nrow(dat)), err = dat[,c(2, 4, 6)], 
          rel_err = dat[,c(3, 5, 7)], test_type = dat[,8]) )

如果您有很多列,那么困难的方法可能涉及对列名进行 grepping。

这种“硬”方式与如何使用命令一样简洁,reshape并且不需要考虑如何使用这些命令。有时我只是跳过思考reshape

于 2012-10-25T11:24:37.963 回答
4

基本功能reshape将让你做到这一点

reshape(DT, direction = 'long', varying = list(paste('err',1:3,sep ='_'), paste('rel_err',1:3,sep ='_')), v.names = c('err','rel_err'), timevar = 'model')
    iter test_type model         err    rel_err id
1.1    1    random     1 -0.09385732 -0.2235443  1
2.1    1      back     1  0.16141630  0.8575728  2
3.1    1     front     1  0.16376930  0.8700738  3
4.1    1    random     1  0.14345986  0.6765194  4
5.1    1      back     1  0.15890059  0.7435382  5
6.1    1     front     1  0.14412360  0.6743928  6
1.2    1    random     2 -0.12169820 -0.2898543  1
2.2    1      back     2  0.14187320  0.7537442  2
3.2    1     front     2  0.14315050  0.7605302  3
4.2    1    random     2  0.12136890  0.5723444  4
5.2    1      back     2  0.15898230  0.7439204  5
6.2    1     front     2  0.14420390  0.6747684  6
1.3    1    random     3 -0.10583660 -0.2520759  1
2.3    1      back     3  0.15848160  0.8419816  2
3.3    1     front     3  0.15965020  0.8481901  3
4.3    1    random     3  0.13746760  0.6482615  4
5.3    1      back     3  0.16087090  0.7527580  5
6.3    1     front     3  0.14635200  0.6848202  6

我同意reshape有时很难理解的语法。我会详细说明这个电话是如何工作的

  • direction = 'long' -- 重塑为long格式
  • varying = list(paste('err',1:3,sep ='_'), paste('rel_err',1:3,sep ='_'))-- 我们传递一个长度为 2 的列表,因为我们试图堆叠成两个不同的变量。列paste('err',1:3,sep ='_')将成为长格式的第一个新变量, paste('rel_err',1:3,sep ='_'))并将成为长格式的第二个新变量
  • v.names = c('err','rel_err')以长格式设置两个新变量的名称
  • timevar = 'model'设置时间标识符的名称(这里是_1宽格式的列。

我希望这更清楚一些。

于 2012-10-25T05:12:27.387 回答