使用 reshape2 对数据框的第一列重新排序

Use reshape2 to reorder the first columns of a data frame

我有一个名为 toyData.txt 的数据集, 它检查参数 (n,mu,sigma) 对 正态分布随机数和读数的期望和方差

n       mu  sigma  Mean   Variance
100     0     1   0.0068   0.9923
100     0     2   0.0281   3.9589
100     5     1   4.9983   1.0055
100     5     2   4.9850   3.9318
1000    0     1   0.0005   1.0042
1000    0     2   0.0041   3.9920
1000    5     1   4.9886   1.0004
1000    5     2   5.0019   3.9582

我想使用 R 中的库 (reshap2) 重新排序 (n,mu,sigma) 到 (mu,sigma,n) [或 (sigma, mu,n)] 和 相应地重新排列均值和方差的值, 然后我试试

dat1 = read.table("toyData.txt", head=T)
library(reshape2)
dat2 = melt(dat1, id.vars=c("mu","sigma","n"))
#  dat3 = dcast(melt(dat1), ???)

然后我有 dat2 作为

    mu sigma    n variable  value
    0     1  100     Mean 0.0068
    0     2  100     Mean 0.0281
    5     1  100     Mean 4.9983
    5     2  100     Mean 4.9850
    0     1 1000     Mean 0.0005
    0     2 1000     Mean 0.0041
    5     1 1000     Mean 4.9886
    5     2 1000     Mean 5.0019
    0     1  100 Variance 0.9923
    0     2  100 Variance 3.9589
    5     1  100 Variance 1.0055
    5     2  100 Variance 3.9318
    0     1 1000 Variance 1.0042
    0     2 1000 Variance 3.9920
    5     1 1000 Variance 1.0004
    5     2 1000 Variance 3.9582

但是,我希望输出为

    mu sigma    n   Mean    Variance
    0     1  100  0.0068    0.9923
    0     1 1000  0.0005    1.0042
    0     2  100  0.0281    3.9589
    0     2 1000  0.0041    3.9920
    5     1  100  4.9983    1.0055
    5     1 1000  4.9886    1.0004
    5     2  100  4.9850    3.9318
    5     2 1000  5.0019    3.9582

那我就不知道怎么办了。 我知道我们可以手动解决这个问题,因为 这是一个小数据框,我想知道 是否有办法通过中的包修复它 我们遇到大型数据集的情况。

无需整形。 只需更改列的顺序,然后排列..

library( tidyverse )

df %>% 
  select( mu, sigma, everything() ) %>%
  arrange( mu, sigma, n )

#   mu sigma    n   Mean Variance
# 1  0     1  100 0.0068   0.9923
# 2  0     1 1000 0.0005   1.0042
# 3  0     2  100 0.0281   3.9589
# 4  0     2 1000 0.0041   3.9920
# 5  5     1  100 4.9983   1.0055
# 6  5     1 1000 4.9886   1.0004
# 7  5     2  100 4.9850   3.9318
# 8  5     2 1000 5.0019   3.9582

如前所述,您不需要整形。您还可以使用 data.table 对数据帧进行排序:

library(data.table)
setDT(dat1)[order(mu,sigma),.(mu,sigma, n, Mean, Variance)]

#returns
   mu sigma    n   Mean Variance
1:  0     1  100 0.0068   0.9923
2:  0     1 1000 0.0005   1.0042
3:  0     2  100 0.0281   3.9589
4:  0     2 1000 0.0041   3.9920
5:  5     1  100 4.9983   1.0055
6:  5     1 1000 4.9886   1.0004
7:  5     2  100 4.9850   3.9318
8:  5     2 1000 5.0019   3.9582