2016-05-04 2 views
0

Ich habe einen Datenrahmen für Sortenprüfungen, der das Vorhandensein oder Fehlen von Sorten an einem bestimmten Ort und in einem bestimmten Jahr anzeigt. Das folgende Beispiel ist eine Teilmenge der Daten.In R, wie erstelle ich reziproke Tabellen, die allgemeine Variablen zeigen?

example<-structure(list(Variety = 1:88, Site1_Yr1 = c(0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 1L), 
Site2_Yr1 = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L 
), 
Site3_Yr1 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
Site1_Yr2 = c(0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L), 
Site2_Yr2 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 
0L, 0L, 1L), 
Site3_Yr2 = c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), 
.Names = c("Variety", "Site1_Yr1", "Site2_Yr1", "Site3_Yr1", "Site1_Yr2", "Site2_Yr2", "Site3_Yr2"), class = "data.frame", row.names = c(NA, -88L)) 

Ich möchte den Datenrahmen zusammenzufassen eine gegenseitige Tabelle zu erzeugen, die zeigt, wie viele Sorten zwischen den Kombinationen von Orten und Jahren üblich waren. Die zusammengefassten Daten würden wie folgt aussehen. Es wäre auch nützlich, die Anzahl der Sorten, die nicht identisch sind, und den Prozentsatz der gemeinsamen Sorten zu zeigen.

result <- structure(list(X = structure(c(1L, 3L, 5L, 2L, 4L, 6L), 
.Label = c("Site1_Yr1", 
"Site1_Yr2", "Site2_Yr1", "Site2_Yr2", "Site3_Yr1", "Site3_Yr2"), 
class = "factor"), Site1_Yr1 = c(5L, 4L, 0L, 2L, 1L, 1L), 
Site2_Yr1 = c(4L, 11L, 4L, 5L, 1L, 1L), 
Site3_Yr1 = c(0L, 4L, 9L, 4L, 0L, 1L), 
Site1_Yr2 = c(2L, 5L, 4L, 10L, 1L, 1L), 
Site2_Yr2 = c(1L, 1L, 0L, 1L, 6L, 1L), 
Site3_Yr2 = c(1L, 1L, 1L, 1L, 1L, 13L)), 
.Names = c("X", "Site1_Yr1", "Site2_Yr1", "Site3_Yr1", "Site1_Yr2", "Site2_Yr2", "Site3_Yr2"), 
class = "data.frame", row.names = c(NA, -6L)) 

Alle Vorschläge würden sehr geschätzt werden!

Update: Ich habe eine Version des Skripts, freundlicherweise von lmo zur Verfügung gestellt, auf einen tatsächlichen Datensatz angewendet.

sitePairs <- t(combn(1:15, 2, FUN=function(i) names(example2[,i]))) 

die gleichen Sorten zu zählen:

example2<- structure(list(Davis.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), Davis.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), Davis.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), DREC.1 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), DREC.2 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), DREC.3 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 3L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE1.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 
0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE1.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE1.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE2.1 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), KARE2.2 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 0L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), KARE2.3 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 3L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), WSREC.1 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 0L, 0L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 3L, 
0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), WSREC.2 = c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 
0L, 3L, 3L, 3L, 0L, 3L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), WSREC.3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 3L, 3L, 0L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L)), .Names = c("Davis.1", 
"Davis.2", "Davis.3", "DREC.1", "DREC.2", "DREC.3", "KARE1.1", 
"KARE1.2", "KARE1.3", "KARE2.1", "KARE2.2", "KARE2.3", "WSREC.1", 
"WSREC.2", "WSREC.3"), row.names = c("83G19", "84G62", "85G01", 
"85G03", "86G32", "87P06", "AG1201", "AG1401", "AG2101", "AG2103", 
"AG3101", "DK28E", "DKS-51-01", "DKS-551-0", "DKS-551-01", "DKS-553-6", 
"DKS-553-67", "DKS26-60", "DKS28-05", "DKS37-07", "DKS44-20", 
"DKS51-01", "DKS53-67", "ExP28133", "EXP28133", "KS310", "KS585", 
"NK5418", "NK7829", "NK8416", "R-0413", "R-06173", "R-10413", 
"R-49473", "R-68653", "R-92123", "SP3425"), class = "data.frame") 

Um Namen der Website-Jahres-Paare zu erhalten

varietyCount <- combn(1:15, 2, FUN=function(i) sum((rowSums(example2[,i])==2))) 

Dies gibt alle Nullen, wenn es in der Tat mehr als 80% Matching sind Werte in den meisten Fällen. Klar verstehe ich falsch was das Skript macht ???

+0

Lassen Sie uns Ihre Versuche sehen. –

+0

Entschuldigung, ich konnte das Skript nicht speichern. –

Antwort

0

Hier ist eine Lösung combn mit:

# get names of site-year pairs 
sitePairs <- t(combn(2:7, 2, FUN=function(i) names(example[,i]))) 

# count the same varieties 
varietyCount <- combn(2:7, 2, FUN=function(i) sum((rowSums(example[,i])==2))) 

# put in a data.frame 
data.frame("site1"= sitePairs[,1], "site2"= sitePairs[,2], "varietyCount"= varietyCount, 
      stringsAsFactors=FALSE) 

Die comb Funktion hier produziert alle paarweise Vergleiche. Ich verwende es zuerst, um die Site-Namen zu erhalten. Bei der Berechnung werden die paarweisen Kombinationen von combn einer Funktion zugeführt, die diese Paare verwendet, um die Daten in die richtigen Spalten zu unterteilen, und prüft dann, ob beide Standortjahre die Sorten produzieren (unter Verwendung von RowSums(...) == 2). Dieser logische Vektor wird dann zu 1s und 0s gezwungen und summiert.

Da example2 aus Nullen und 3en besteht, ändern Sie einfach RowSums(...) == 2 in RowSums(...) == 6 und Sie erhalten die Anzahl, die Sie suchen.

+0

Vielen Dank! Ich habe dein Beispiel benutzt, hatte aber Probleme (siehe Update oben). –

+0

@NicGeorge Wie ich in meiner Antwort erklärt habe, habe ich 'RowSums (...) == 2' verwendet, um auszulösen, ob die Site-Year-Combos denselben Typ erzeugt haben oder nicht. Ihr Beispiel-Dataset bestand aus Nullen und Einsen {0, 1}. Das neue Dataset besteht jedoch aus Nullen und 3s. Wenn Sie also diese Bedingung in "RowSums (...) == 6" ändern, wird Ihr Problem gelöst. – lmo