2016-12-01 5 views
0

同じ名前の行に対して行列(U)を列方向に並べ替える必要があります。今私は、同じ行を探して行列をループにしたいR:ループ行列を特定の行ごとに個別に並べ替えます

1 2 
1 5 6 
1 -4 4 
1 6 -2 
2 7 -2 
2 -2 3 

し、このマトリックスが得られ、同じrow.nameを持つ列を並べ替える::私の(非常に大きい)行列は次のようになり

1 2 
1 -4 -2 
1 5 4 
1 6 6 
2 -2 -2 
2 7 3 

今までの私のコードは次のようになります。

まずステップた作品行数、:

z <- 1 
for(i in (1:nrow(U))){ 
if(row.names(U)[i] != row.names(U)[i-1]){ 
z = (sum(row.names(U) == row.names(U)[i]))+1}} 

今私は、行のソート機能をカウントした後に追加したいと私は手動で行の最初のセットのためにこれを試してみました:

x <- 1 
for(x in (1:ncol(U))){ 
    U[1:3,x]<- U[do.call(order, lapply(x:NCOL(U), function(x) U[1:3, x] 

しかし、このループは、一方では非常に遅く、一方、それだけ最初の列を正しく塗りつぶす

パフォーマンスの問題を考慮しながらソート機能を改善する方法をお勧めしますか?

編集:これは私の最初の編集で混乱していたと思います。私の行列の最初の「列」はrow.namesであり、この例では5x2行列です。

答えて

0

を使用する代替ここだけ順()行名で、次に順番に各列で最初に使用するアプローチです。これはあなたの後のことですか?

U <- matrix(c(5,6,-4,4,6,-2,7,-2,-2,3), byrow=TRUE, ncol=2, dimnames=list(c(1,1,1,2,2), c(1,2))) 

apply(U, 2, function(j) j[order(rownames(U), j)]) 
+0

あなたの適用関数は、私が後にしたものとまったく同じです。ありがとうございました :) – Max

0

data.tableを使用して、最初の列( 'U')でグループ化されたdata.tableに変換し、そしてsort

library(data.table) 
as.data.table(m1)[, lapply(.SD, sort), by = U] 
+1

私は推測する、私はあなたのポイントを持って、今私はそれがうまくいくと思う: 'as.data.table(U)[、lapply(.SD、ソート)、=リストによって(row.names(U)) ] ' – Max

+0

@Max私はあなたの最初の列で、行の名前ではないと思った。 – akrun

0

dplyr

df = read.table(textConnection("U 1 2 
1 5 6 
1 -4 4 
1 6 -2 
2 7 -2 
2 -2 3"), header= TRUE) 

library(dplyr) 
df %>% group_by(U) %>% transmute(sort(X1),sort(X2)) 
関連する問題