在R中将数据帧重新整形为长格式

时间:2012-10-25 04:48:27

标签: r reshape

我正在努力解决R中的重塑问题。我有2种类型的错误(错误和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

然后......

我已尝试过使用语法,但无法弄清楚要为时间添加什么。变化的参数

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

2 个答案:

答案 0 :(得分: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]) )

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

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

答案 1 :(得分: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

我希望这更清楚一点。