3 Stimmen

Erstellung einer Matrix von Zahlen- und Namensaufträgen

Ich habe die folgenden Daten:

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)

Ich möchte Daten zusammenfassen:

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

Erstellen Sie nun eine Matrix, hoffentlich numerisch, matm ist nicht !

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" 

Ich habe in data.frame konvertiert, dann

    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

Ich möchte die Genotypen-Spalte loswerden und sie dann in eine Matrix umwandeln

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"

Ich habe zwei Fragen:

(1) Gibt es eine einheitliche Methode, eine Matrix numerisch zu machen/zuzuweisen?

(2) Ich kann sehen, dass die Spaltennamen der Genotypen alphabetisch sortiert sind. Meine Datei hat eine andere Reihenfolge in der Spalte. Ich habe kein Problem mit dieser Reihenfolge, wenn sie konsistent ist, aber ich habe Angst vor dem folgenden Teil:

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

Wenn es eine unterschiedliche Reihenfolge der Aggregatfunktion gibt und levels(mydf$environments), Sortieren sie beide alphabettisch oder nach Datei.

Ich weiß Ihren Vorschlag zu schätzen.

5voto

JD Long Punkte 57096

I denken Ich verstehe, woher die Verwirrung rührt. Wenn Sie die Aggregation vornehmen, die Sie in eine Matrix umwandeln wollen, versuchen Sie, diese zu erfassen und zu betrachten:

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

erbringt:

> 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 ...

Das Aggregat erzeugt also einen etwas untypischen data.frame. Die Spalte yvar ist die Matrix, an der Sie interessiert sind:

> 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

Sie können also direkt darauf zugreifen:

matdm <- myAgg$yvar

Um nun Ihre konkreten Fragen zu beantworten...

1) Der einheitliche Weg, eine Matrix numerisch zu machen, besteht darin, sicherzustellen, dass die Daten, die in die matrix() oder as.matrix() Funktionen sind numerisch. Wenn Sie die Funktion

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

Sie haben eine Zeichenmatrix erstellt, weil Sie eine Zeichenspalte hatten. Dann haben Sie diese Matrix in einen data.frame umgewandelt. Dadurch wurden die Spalten in Faktoren umgewandelt. Dann wählten Sie einige Spalten aus, die - wenig überraschend - immer noch Faktoren waren. Wenn Sie also

matdm <- as.matrix(matx)

die Faktoren wurden in Zeichen umgewandelt.

2) Die Reihenfolge der Variablen, die durch

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

ist eine Funktion der Reihenfolge der Faktoren in der Variablen genotypes . Diese sind in der Regel alphabetisch geordnet, aber Sie können sich immer die Ebenen ansehen, um ganz sicher zu sein. Wenn die Faktoren manuell erstellt würden, wären sie nicht unbedingt in alphabetischer Reihenfolge.

1voto

Ramnath Punkte 52709

Dies ist eine Aufgabe für die reshape2 Paket. Hier ist der Code

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X