从重新整形的数据

时间:2016-06-30 13:52:36

标签: r sorting dataframe reshape

我已经将数据重新整理了很长时间。它已根据一列(在下面的可再现示例中为x2)按升序排序,我希望以重复的方式保留数据而不是分解。这是一个示例:

set.seed(234)
data<-data.frame(x1=c(1:12),x2=rep(1:3,each=4),x3=runif(12,min=0,max=12))

我希望格式如下:

   x1 x2       x3
1   1  1 6.115445
2   2  2 5.157014
3   3  3 4.793458
4   4  1 9.998710
5   5  2 2.620250
6   6  3 1.825839
7   7  1 5.842854
8   8  2 5.616670
9   9  3 6.511315
10 10  1 9.164444
11 11  2 8.401418

在将数据转换为长格式或我应该用于重新排列数据时应该使用的任何其他函数中,您能否帮助我解决melt函数中包含的内容。

注释
上面的结果是显示所需的格式,而不是我的数据的确切解决方案。

编辑: 以下是我的真实数据head()

       Date stn Elev  Amount
1 2010-01-01  11    0 268.945
2 2010-01-01  11    0 268.396
3 2010-01-01  11    0 267.512
4 2010-01-01  11    0 266.488
5 2010-01-01  11    0 265.558
6 2010-01-01  11    0 265.178

在实际数据中,列Elev包含c("0","100","250","500"...)等值。因此,您假设0相当于上述示例的1中的x2,等等100250 ....

1 个答案:

答案 0 :(得分:1)

一种方法是使用ave,如下所示:

data[order(ave(data$x3, data$x2, FUN=function(i) 1:length(i)), data$x2),]
   x1 x2         x3
1   1  1  8.9474400
5   5  2  0.8029211
9   9  3 11.1328381
2   2  1  9.3805491
6   6  2  7.7375415
10 10  3  3.4107614
3   3  1  0.2404454
7   7  2 11.1526315
11 11  3  6.6686992
4   4  1  9.3130246
8   8  2  8.6117063
12 12  3  6.5724198

在这种情况下,ave按数据$ x2计算运行计数,然后用于使用order函数对数据进行排序。

如果需要,您还可以重新编号x1:data$x1 <- 1:nrow(data),这将返回您想要的结果。