簡體   English   中英

制作矩陣數字和名稱順序

[英]Making matrix numeric and name orders

我有以下數據:

yvar <- c(1:150)
replication <- c( rep(c(rep(1, 10), rep(2,10), rep(3,10)),5))
genotypes <- c(rep(paste("G", 1:10, sep= ""), 15))
environments <- c(rep(paste("E",5:1, sep = ""), each = 30))
mydf1 <- data.frame (yvar, replication, genotypes, environments)
mydf1$replication <- as.factor(mydf1$replication)

我想總結一下數據:

mydf = data.frame(aggregate (yvar ~ genotypes + environments, data = mydf1, mean))

現在創建一個矩陣,希望數字,matm不是!

matm = as.matrix(aggregate(yvar ~ genotypes, mydf, 'c'))
colnames(matm) <- c("genotypes", levels(mydf$environments))
      genotypes E1    E2    E3    E4    E5   
 [1,] "G1"      "131" "101" " 71" " 41" " 11"
 [2,] "G10"     "140" "110" " 80" " 50" " 20"
 [3,] "G2"      "132" "102" " 72" " 42" " 12"
 [4,] "G3"      "133" "103" " 73" " 43" " 13"
 [5,] "G4"      "134" "104" " 74" " 44" " 14"
 [6,] "G5"      "135" "105" " 75" " 45" " 15"
 [7,] "G6"      "136" "106" " 76" " 46" " 16"
 [8,] "G7"      "137" "107" " 77" " 47" " 17"
 [9,] "G8"      "138" "108" " 78" " 48" " 18"
[10,] "G9"      "139" "109" " 79" " 49" " 19" 

然后,我轉換為data.frame

    matd <- data.frame(matm)

  genotypes       E1       E2       E3       E4       E5
1         G1 31.70000 26.76667 23.60000 30.73333 43.13333
2        G10 32.40000 17.86667 28.83333 32.43333 30.23333
3         G2 29.50000 24.60000 24.16667 33.43333 38.66667
4         G3 27.00000 28.83333 33.63333 43.83333 29.60000
5         G4 29.53333 29.90000 26.60000 26.13333 40.33333
6         G5 27.40000 32.43333 27.96667 40.43333 41.46667
7         G6 36.76667 32.26667 28.26667 38.73333 33.43333
8         G7 29.63333 27.00000 26.96667 34.90000 40.70000
9         G8 24.50000 23.26667 22.50000 27.60000 32.26667
10        G9 31.60000 24.96667 24.46667 27.56667 36.26667

我想擺脫基因型列,然后將其轉換為矩陣

matx = data.frame(matd[,-1])
matdm <- as.matrix(matx) 
matdm 
      E1         E2         E3         E4         E5        
 [1,] "31.70000" "26.76667" "23.60000" "30.73333" "43.13333"
 [2,] "32.40000" "17.86667" "28.83333" "32.43333" "30.23333"
 [3,] "29.50000" "24.60000" "24.16667" "33.43333" "38.66667"
 [4,] "27.00000" "28.83333" "33.63333" "43.83333" "29.60000"
 [5,] "29.53333" "29.90000" "26.60000" "26.13333" "40.33333"
 [6,] "27.40000" "32.43333" "27.96667" "40.43333" "41.46667"
 [7,] "36.76667" "32.26667" "28.26667" "38.73333" "33.43333"
 [8,] "29.63333" "27.00000" "26.96667" "34.90000" "40.70000"
 [9,] "24.50000" "23.26667" "22.50000" "27.60000" "32.26667"
[10,] "31.60000" "24.96667" "24.46667" "27.56667" "36.26667"

我有兩個問題:

(1)是否有一致的方法來制作/分配矩陣數字

(2)我可以看到基因型列名按字母順序排序。 我的文件在列中有不同的順序。 如果這是一致的話我對這個訂單很好,但我擔心以下部分:

colnames(matm) <- c("genotypes", levels(mydf$environments))

如果聚合函數和levels(mydf$environments),有不同的順序levels(mydf$environments),它們是按字母順序排序還是在文件中排序。

感謝你的建議。

我看到了混亂的來源。 稍微備份,當你進行聚合時,你想變成一個矩陣; 嘗試捕獲並查看它:

myAgg <- aggregate(yvar ~ genotypes, mydf, 'c')
str(myAgg)

收益率:

> str(myAgg)
'data.frame':   10 obs. of  2 variables:
 $ genotypes: Factor w/ 10 levels "G1","G10","G2",..: 1 2 3 4 5 6 7 8 9 10
 $ yvar     : num [1:10, 1:5] 131 140 132 133 134 135 136 137 138 139 ...

因此聚合產生了一些有點不典型的data.frame。 yvar實際上是您感興趣的矩陣:

> myAgg$yvar
      [,1] [,2] [,3] [,4] [,5]
 [1,]  131  101   71   41   11
 [2,]  140  110   80   50   20
 [3,]  132  102   72   42   12
 [4,]  133  103   73   43   13
 [5,]  134  104   74   44   14
 [6,]  135  105   75   45   15
 [7,]  136  106   76   46   16
 [8,]  137  107   77   47   17
 [9,]  138  108   78   48   18
[10,]  139  109   79   49   19

所以你可以直接抓住它:

matdm <- myAgg$yvar

現在回答你的具體問題......

1)使矩陣數字化的一致方法是確保進入matrix()as.matrix()函數的數據是數字的。 你打電話的時候

matm = as.matrix(aggregate(yvar ~ genotypes, mydf, 'c'))

你創建了一個字符矩陣,因為你有一個char列。 然后,您將該矩陣轉換為data.frame。 這將列轉換為因子。 然后你選擇了幾個列,這些因素並不令人驚訝。 所以你打電話的時候

matdm <- as.matrix(matx)

因素轉換為字符。

2)由...創建的變量的順序

aggregate(yvar ~ genotypes, mydf, 'c')

是變量genotypes因子順序的函數。 這些通常是按字母順序創建的,但您可以隨時查看關卡以便完全確定。 如果手動創建因子,則不一定按字母順序排列。

這是reshape2包的一項工作。 這是代碼

library(reshape2); library(plyr)
ans <- dcast(mydf1, genotypes ~ environments, mean, value_var = 'yvar')
ans <- mutate(ans, genotypes = sub("G", "", genotypes))
arrange(ans, genotypes)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM