2016-05-12 8 views
-2

Ich bin neu bei R und mache eine letzte Aufgabe für die Klasse. Ich habe Probleme mit der Datenbereinigung bekommen. Zum Beispiel habe ich diesen Datenrahmen wie folgt.Wie wird der Datenrahmen in R in die Paarzahl umgewandelt?

StudentId table_wk1 table_wk2 table_wk3 
0034  1   1   2 
0067  1   1   1 
0098  1   2   2 
0079  2   2   1 

Was ich erreichen möchte, ist dieses Datenfeld in folgenden Array zu verwandeln. Immer dann, wenn die beiden Studenten die gleiche Tabelle wählen, gäbe es eine Zählung zwischen ihnen sein, so wäre es wie:

0034 0067 2 
0034 0098 2 
0034 0079 0 
0067 0098 1 
0067 0079 1 
0098 0079 1 

Thank you! Bitte sagen Sie mir, ob meine Frage nicht klar ist. Das ist meine erste Frage hier.

Antwort

0

Wenn ich Ihre Anfrage richtig verstanden habe, wird die Zählung aktiviert, wenn die table_wk Werte zwischen den beiden Studenten IDs gleich sind.

Der folgende Code erstellt im Grunde einen neuen Datenrahmen für die Kombination von Studenten-IDs (Sie können auch gtools oder combinat Paket dafür verwenden), dann berechnet das Ergebnis auf der Grundlage der Vergleich der beiden Kombination.

# Generate data 
df <- data.frame(StudentId = c("0034", "0067", "0098", "0079"), 
       table_wk1 = c(1, 1, 1, 2), 
       table_wk2 = c(1, 1, 2, 2), 
       table_wk3 = c(2, 1, 2, 1), 
       stringsAsFactors = F) 

# Process data 
df2 <- as.data.frame(t(combn(df$StudentId, 2)), stringsAsFactors = F) 
df2.1 <- merge(df2[-2], df, by.x = 'V1', by.y = 'StudentId', sort = F) 
df2.2 <- merge(df2[-1], df, by.x = 'V2', by.y = 'StudentId', sort = F) 
df2.2 <- df2.2[match(df2$V2, df2.2$V2),] # Solve the sorting issue due to merge 

# Create result 
df2$Result <- rowSums(df2.1[-1] == df2.2[-1]) 
0

zuerst alle möglichen Kombinationen von Studenten schaffen

df$StudentId = as.character(df$StudentId) 
df_new=data.frame(t(combn(df$StudendId,2))) 

> df_new 
    X1 X2 
1 0034 0067 
2 0034 0098 
3 0034 0079 
4 0067 0098 
5 0067 0079 
6 0098 0079 

Nun verwenden die Funktion und die Schleife in df_new durch jede Zeile anwenden, um die 2 studentIDs mit den entsprechenden Zeilen in df passenden und in dem Spalten herauszufinden die zwei Reihen sind gleich.

df_new$Value_Count = apply(df_new,1, function(x) sum(df[df$StudendId == x[1],2:4] == df[df$StudendId == x[2],2:4])) 


> df_new 
    X1 X2 Value_Count 
1 0034 0067   2 
2 0034 0098   2 
3 0034 0079   0 
4 0067 0098   1 
5 0067 0079   1 
6 0098 0079   1 
+0

Vielen Dank! Es hilft wirklich meine Frage! –

Verwandte Themen