2

行数が同じ(つまり691)で列数が異なる(つまり22-25)22個の行列があります。各マトリックスの同じ行、同じ列に対応する値を追加する必要があり、その結果、次元が 691*25 の 1 つのマトリックスになります。

fullanno1 has 691 rows & 25 columns:
>colnames(fullanno1)
[1] "coding-notMod3"                "coding-synonymous"             "coding-synonymous-near-splice"
[4] "intergenic"                    "intron"                        "missense"                     
[7] "missense-near-splice"          "near-gene-3"                   "near-gene-5"                  
[10] "splice-3"                      "splice-5"                      "stop-gained"                  
[13] "stop-gained-near-splice"       "stop-lost"                     "utr-3"                        
[16] "utr-5"                         "CTCF"                          "E"                            
[19] "None"                          "PF"                            "R"                            
[22] "T"                             "TSS"                           "WE"                           
[25] "coding-notMod3-near-splice"   

fullanno2 has 691 rows and 22 columns:
>colnames(fullanno2)

[1] "coding-synonymous"             "coding-synonymous-near-splice" "intergenic"                   
[4] "intron"                        "missense"                      "missense-near-splice"         
[7] "near-gene-3"                   "near-gene-5"                   "splice-3"                     
[10] "splice-5"                      "stop-gained"                   "stop-lost"                    
[13] "utr-3"                         "utr-5"                         "CTCF"                         
[16] "E"                             "None"                          "PF"                           
[19] "R"                             "T"                             "TSS"                          
[22] "WE" 

各行列は、数値を含む二重行列です。これらの 2 つの行列を追加して、次元が 691*25 の 3 つ目の行列を取得するにはどうすればよいですか。fullanno2 は 3 列短いため、これらの列の結果の行列には、最初の行列の値のみが含まれます。

私のアプローチ: colnames の setdiff を取得して、小さいマトリックスに存在しない列を取得し、0 を値として小さいマトリックスに cbind します。次に、2 つの行列を追加します。

> column.names<-setdiff(colnames(fullanno1),colnames(fullanno2))
[1] "coding-notMod3"             "stop-gained-near-splice"    "coding-notMod3-near-splice"
> column<-0
>cbind(fullanno2,column)
>colnames(fullanno2)[23]<-column.name[1]
>cbind(fullanno2,column)
>colnames(fullanno2)[24]<-column.name[2]
>cbind(fullanno2,column)
>colnames(fullanno2)[25]<-column.name[3]

しかし、これはすべての行列にとって面倒です。助言がありますか?

4

2 に答える 2

3

では、すべての行列を合計して 1 つの行列にしたいですか? シンプルだがおそらく遅い (私は疑うが、行列に関しては大した問題ではないだろう) 方法は、 ライブラリplyrreshape2ライブラリを使用することである。行列のリストから始めることができます:

make.matrix <- function() {
  cols <- sample(month.name, runif(1, 2, 12))
  matrix(rnorm(length(cols)*10), 10, length(cols), dimnames=list(NULL, cols))
}

# Make 10 matrices filled with random numbers, having
# varying numbers of columns named after months
my.matrices <- replicate(10, make.matrix())

次に、すべてのマトリックスを1つの大きなデータフレームに溶かすことができます

matrix.df <- ldply(my.matrices, melt, varnames=c("row", "col"))
head(matrix.df)
#   row      col      value
# 1   1 February -0.4239145
# 2   2 February  1.1773608
# 3   3 February -2.9565403
# 4   4 February  0.3955096
# 5   5 February -0.3784917
# 6   6 February -0.6234579

次に、それをマトリックスにキャストします。

sum.matrix <- acast(matrix.df, row ~ col, sum)
于 2013-10-12T18:12:09.157 に答える