2016-06-30 3 views
0

2つの行列をRで部分的に重複するrownamesと組み合わせたい。rownamesが一致すると、2つの行列の値が隣接する列として終わるはずです。 rownamesが1つの行列にのみ存在する場合は、もう1つの行列に空のスペースを挿入する必要があります。rownameで行列を結合し、Rの不一致要素に空白を挿入するには?

データセット:

testm1 <- cbind("est"=c(1.5,1.2,0.7,4.0), "lci"=c(1.1,0.9,0.5,0.9), "hci"=c(2.0,1.7,0.8,9.0)) 
rownames(testm1) <- c("BadFood","NoActivity","NoSunlight","NoWater") 
testm1 #Factors associated with becoming sick 
testm2 <- cbind("est"=c(3.0,2.0,0.9,7.0), "lci"=c(1.3,1.2,0.2,2.0), "hci"=c(5.0,3.1,1.7,9.0)) 
rownames(testm2) <- c("BadFood","NoActivity","Genetics","Age") 
testm2 #Factors associated with dying 

所望の出力:

  Sick  Dying 
      est lci hci est lci hci 
BadFood 1.5 1.1 2.0 3.0 1.3 5.0 
NoActivity 1.2 0.9 1.7 2.0 1.2 3.1 
NoSunlight 0.7 0.5 0.8 - - - 
NoWater 4.0 0.9 9.0 - - - 
Genetics - - - 0.9 0.2 1.7 
Age  - - - 7.0 2.0 9.0 

すべての行列のために働くだろうとこれを行う簡単な方法はありますか?

+0

を返します。 stackoverflowについて質問するだけの簡単な質問? – CarlAH

答えて

1

がマトリクス状にすべてを保持するベースRの方法であって、最後の2行で

# get rownames of new matrix 
newNames <- union(rownames(testm1), rownames(testm2)) 
# construct new matrix 
newMat <- matrix(NA, length(newNames), 2*ncol(testm2), 
       dimnames=list(c(newNames), rep(colnames(testm1), 2))) 
# fill in new matrix 
newMat[match(rownames(testm1), newNames), 1:ncol(testm1)] <- testm1 
newMat[match(rownames(testm2), newNames), (ncol(testm1)+1):ncol(newMat)] <- testm2 

matchは、行名で適切な行インデックスを見つけるために使用されます。

これは約 "-1" アウトがっかり

newMat 
      est lci hci est lci hci 
BadFood 1.5 1.1 2.0 3.0 1.3 5.0 
NoActivity 1.2 0.9 1.7 2.0 1.2 3.1 
NoSunlight 0.7 0.5 0.8 NA NA NA 
NoWater 4.0 0.9 9.0 NA NA NA 
Genetics NA NA NA 0.9 0.2 1.7 
Age   NA NA NA 7.0 2.0 9.0 
+0

それは私が欲しかったすべてをやったので、これを受け入れる – CarlAH

1

私はこれがあなたの後ろにあるとは思っていますが、それほど美しくないし、データがマトリックスではなくdata.frameであることが必要です。少なくともそれが役立つことを願っています! (コードは、この質問の答え& https://stackoverflow.com/a/34530141/4651564から適応されました)

library(dplyr) 
dat1 <- as.data.frame(testm1) 
dat2 <- as.data.frame(testm2) 
full_join( dat1 %>% mutate(Symbol = rownames(dat1) ), 
      dat2 %>% mutate(Symbol = rownames(dat2) ), 
      by = 'Symbol') 
+0

この解決策はきれいだと思われますが、dplyrをインストールしているにもかかわらず、 "full_join"機能がコンピュータ上に見つかりませんでした。あなたがそれを実行したときに、そのコードはあなたのために働いたのですか? – CarlAH

+0

dplyrのどのバージョンをインストールしましたか? '' 'full_join'''がバージョン0.4.0で追加されました。2015年1月9日[ref](https://blog.rstudio.org/2015/01/09/dplyr-0-4-0/) – CroGo

+0

Ahhh、それはそれを説明する。バージョン0.2がインストールされていた。 – CarlAH

1

あなたがマージ()関数を使用してそれを行うことができます。 まず、テスト行列をデータフレームにキャストし、データフレームにマージを使用し、最後に結果を行列に変換します(ただし行列は必ず必要ですか?)。あなたは、データフレームを取得したい場合は、単にコードの最後の行を省略

testm1 <- as.data.frame(testm1) 
testm2 <- as.data.frame(testm2) 
result <- merge(testm1, testm2, by='row.names', all.x=T, all.y=T) 
# all.x is needed if you want to save rows not matched in the merge process 
result <- as.matrix(result) 

: は、ここではサンプルコードです。お役に立てれば。ここ

+0

これは私のために働いた。唯一の問題は、行の順序がちょっと乱雑であることです。 – CarlAH

+0

はい、私は行の順序が重要ではないと仮定しました。行の順序を関数の引数で変更することができます。しかし、あなたは理由がある、私は前にそれを考えている必要があります:) – Eugen

関連する問題