[英]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.