2016-01-04 74 views
1

我有一組數據如下:從列排序並將其粘貼到一個不同的行

ID Distance 
0 270.4170919 
0 240.0230499 
0 270.5878873 
0 260.3663412 
0 88.81341556 
1 5564.323783 
1 5625.862105 
1 5709.559224 
1 5809.231131 
1 6286.892713 
2 326.8418382 
2 439.2376606 
2 427.4494778 
2 327.625258 
2 326.3938459 
3 601.9958829 
3 323.1702281 
3 755.3196593 

有五行ID 0,1..325與它們的對應的值(距離)。我想拆基於行(距離)值的列(ID)並粘貼到多行如下:

A   B   C   D   E 
0 88.81341556 240.0230499 260.3663412 270.4170919 270.5878873 
1 5564.323783 5625.862105 5709.559224 5809.231131 6286.892713 
2 326.3938459 326.8418382 327.625258 427.4494778 439.2376606 
3 323.1702281 334.7788259 601.9958829 710.3485862 755.3196593 

我不知道在哪裏以及如何開始的代碼。

回答

4

您可以根據ID進行拆分,然後對每個拆分進行排序。然後轉置它以匹配您想要的矩陣作爲輸出。

t(sapply(split(d$Distance, d$ID), sort)) 
#  [,1]  [,2]  [,3]  [,4]  [,5] 
#0 88.81342 240.0230 260.3663 270.4171 270.5879 
#1 5564.32378 5625.8621 5709.5592 5809.2311 6286.8927 
#2 326.39385 326.8418 327.6253 427.4495 439.2377 
#3 323.17023 334.7788 601.9959 710.3486 755.3197 

幾個備選方案:

t(apply(matrix(d$Distance, nrow=5), 2, sort)) # rows aren't named here 

do.call(rbind, lapply(split(d$Distance, d$ID), sort)) 

matrix(d[with(d, order(ID, Distance)), "Distance"], 
    ncol = 5, 
    byrow = TRUE, 
    dimnames = list(unique(d$ID))) # make sure IDs are in the right order 

採樣數據(注意,所提供的樣本數據中缺少ID 3兩個值,和我說他們在我的樣本數據在這裏):

d <- read.table(text=" 
ID Distance 
0 270.4170919 
0 240.0230499 
0 270.5878873 
0 260.3663412 
0 88.81341556 
1 5564.323783 
1 5625.862105 
1 5709.559224 
1 5809.231131 
1 6286.892713 
2 326.8418382 
2 439.2376606 
2 427.4494778 
2 327.625258 
2 326.3938459 
3 601.9958829 
3 323.1702281 
3 755.3196593 
3 334.7788259 
3 710.3485862", header=TRUE) 
4

下面是使用unstack

t(unstack(d[do.call(order, d),], Distance~ID)) 
#  [,1]  [,2]  [,3]  [,4]  [,5] 
#X0 88.81342 240.0230 260.3663 270.4171 270.5879 
#X1 5564.32378 5625.8621 5709.5592 5809.2311 6286.8927 
#X2 326.39385 326.8418 327.6253 427.4495 439.2377 
#X3 323.17023 334.7788 601.9959 710.3486 755.3197 
另一種選擇

或用dcastdata.table

library(data.table) 
dcast(setDT(d)[order(ID, Distance)][, N:= 1:.N ,ID], 
         N~ID, value.var='Distance')[, N:= NULL] 

注意:我們得到了所需要的輸出被調換爲早。

+5

儘管鍵入的內容更多,但「data.table」版本是目前唯一可應對不平衡數據的答案(例如,每個ID的記錄數不同)。 – A5C1D2H2I1M1N2O1R2T1

相關問題