Making matrix numeric and name orders
我有以下数据:
1 2 3 4 5 6 | 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) |
我要汇总数据:
1 | mydf = data.frame(aggregate (yvar ~ genotypes + environments, data = mydf1, mean)) |
现在创建一个矩阵,希望是数字,matm不是!
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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,然后转换为
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
我想摆脱基因型列,然后将其转换为矩阵
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)我可以看到基因型列名称按字母顺序排序。我的文件在列中的顺序不同。如果顺序一致,我可以接受此命令,但是我担心以下部分:
1 | colnames(matm) <- c("genotypes", levels(mydf$environments)) |
如果聚合函数的顺序不同,并且
感谢您的建议。
我想我知道混乱的根源。稍微备份一下,当您进行聚合时,您希望将其转换为矩阵。尝试捕获并查看它:
1 2 | myAgg <- aggregate(yvar ~ genotypes, mydf, 'c') str(myAgg) |
产量:
1 2 3 4 | > 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。
1 2 3 4 5 6 7 8 9 10 11 12 | > 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 |
因此您可以直接抓住它:
1 | matdm <- myAgg$yvar |
现在要回答您的特定问题...
1)制作矩阵数字的一致方法是确保进入
您创建了一个字符矩阵,因为您有一个char列。然后,您将该矩阵转换为data.frame。这将列转换为因子。然后,您选择了几列仍然不受影响的列。因此,当您呼叫
这些因素已转换为字符。
2)
创建的变量的顺序
是变量
这是
1 2 3 4 | library(reshape2); library(plyr) ans <- dcast(mydf1, genotypes ~ environments, mean, value_var = 'yvar') ans <- mutate(ans, genotypes = sub("G","", genotypes)) arrange(ans, genotypes) |