使用熔化/铸造重新排列数据帧的问题

时间:2019-01-23 18:43:31

标签: r reshape reshape2

我想使用强制转换功能(重塑包装)以返回到原始数据框状态,但是不起作用。 在我的示例中:

#First simulate some data
set.seed(123)
bands=5
data <- data.frame(matrix(runif(10*bands),ncol=bands))
colnames(data) <- paste0(1:bands)
data$nitrogen <- rpois(10,10)
data$Class<-rep("test",10)
#

# Reshape with melt function 
library(reshape)
data2 <- melt(data, id=c("nitrogen","Class"))

#Return to original data state again
data3<-cast(data2, Class+nitrogen~variable)
data3
  Class nitrogen 1 2 3 4 5
1  test        4 1 1 1 1 1
2  test        5 1 1 1 1 1
3  test        6 2 2 2 2 2
4  test        8 1 1 1 1 1
5  test       11 1 1 1 1 1
6  test       12 4 4 4 4 4

我期望:

           1          2         3          4         5 nitrogen Class
1  0.2875775 0.95683335 0.8895393 0.96302423 0.1428000        4  test
2  0.7883051 0.45333416 0.6928034 0.90229905 0.4145463        6  test
3  0.4089769 0.67757064 0.6405068 0.69070528 0.4137243        6  test
...
10 0.4566147 0.95450365 0.1471136 0.23162579 0.8578277       11  test

返回数据对象的转换方法不起作用,请任何成员帮助我吗? 谢谢

1 个答案:

答案 0 :(得分:1)

类和氮的组合不是唯一的:类==“ test”和氮== 11的次数是四次,类==“ test”和氮== 6的次数是六次。来自帮助文档:

  

如果您提供的变量组合不能唯一地标识原始数据集中的一行,那么您将需要提供一个汇总函数fun.aggregate。此函数应采用数字向量并返回汇总统计信息。

因此,cast将汇总重复的组合。除非您输入某种使组合唯一的虚拟变量,否则您将无法恢复原始数据。

data$dummy <- 1:10

data3 <- cast(data2, Class + nitrogen + dummy ~ variable)
data3
   Class nitrogen dummy         1          2         3          4         5
1   test        4     1 0.2875775 0.95683335 0.8895393 0.96302423 0.1428000
2   test        5     5 0.9404673 0.10292468 0.6557058 0.02461368 0.1524447
3   test        6     2 0.7883051 0.45333416 0.6928034 0.90229905 0.4145463
4   test        6     3 0.4089769 0.67757064 0.6405068 0.69070528 0.4137243
5   test        8     4 0.8830174 0.57263340 0.9942698 0.79546742 0.3688455
6   test       11    10 0.4566147 0.95450365 0.1471136 0.23162579 0.8578277
7   test       12     6 0.0455565 0.89982497 0.7085305 0.47779597 0.1388061
8   test       12     7 0.5281055 0.24608773 0.5440660 0.75845954 0.2330341
9   test       12     8 0.8924190 0.04205953 0.5941420 0.21640794 0.4659625
10  test       12     9 0.5514350 0.32792072 0.2891597 0.31818101 0.2659726

如果希望虚拟列完全相同,请更改列的顺序并将其删除。

data3[,c(4:8, 2, 1)]
           1          2         3          4         5 nitrogen Class
1  0.2875775 0.95683335 0.8895393 0.96302423 0.1428000        4  test
2  0.9404673 0.10292468 0.6557058 0.02461368 0.1524447        5  test
3  0.7883051 0.45333416 0.6928034 0.90229905 0.4145463        6  test
4  0.4089769 0.67757064 0.6405068 0.69070528 0.4137243        6  test
5  0.8830174 0.57263340 0.9942698 0.79546742 0.3688455        8  test
6  0.4566147 0.95450365 0.1471136 0.23162579 0.8578277       11  test
7  0.0455565 0.89982497 0.7085305 0.47779597 0.1388061       12  test
8  0.5281055 0.24608773 0.5440660 0.75845954 0.2330341       12  test
9  0.8924190 0.04205953 0.5941420 0.21640794 0.4659625       12  test
10 0.5514350 0.32792072 0.2891597 0.31818101 0.2659726       12  test