我正在努力解决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
然后......
我已尝试过使用语法,但无法弄清楚要为时间添加什么。变化的参数
非常感谢您提供的任何帮助。
答案 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
。我希望这更清楚一点。