2017-01-20 2 views
0

Ich bin mir sicher, dass es eine super-einfache Antwort darauf gibt. Ich versuche, Bewertungen zu Themen basierend auf ihrer eindeutigen ID zu kombinieren. Hier ist ein Testdatensatz (genannt Aggregate_Test) I erstellt, in dem die ID zum Thema eindeutig zuzuordnen ist, und die StaticScore wurde von verschiedenen Beurteilern getan:Befehl Aggregieren in R zum Kombinieren von Zeilen basierend auf eindeutiger ID - Ausgabedatenstruktur?

ID StaticScore 
1 6 
2 7 
1 5 
2 6 
3 7 
4 8 
3 4 
4 5 

Nach anderen Beiträgen sorgfältig zu lesen, habe ich Aggregat folgenden zu erstellen Datensatz mit neuen Spalten:

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 
    > StaticAggregate 

ID StaticScore.1 StaticScore.2 
1 1    6    5 
2 2    7    6 
3 3    7    4 
4 4    8    5 

Dieser Datenrahmen hat folgende str:

> str(StaticAggregate) 
    'data.frame': 4 obs. of 2 variables: 
    $ ID   : num 1 2 3 4 
    $ StaticScore: num [1:4, 1:2] 6 7 7 8 5 6 4 5 

Wenn ich versuche, eine neue Variable zu erstellen StaticScore durch Subtraktion. 1 von StaticScore.2, erhalte ich folgende Fehlermeldung:

Staticdiff<-StaticScore.1-StaticScore.2 Error: object 'StaticScore.1' not found

, bitte helfen Sie mir also - was diese Datenstruktur ist durch Aggregat erstellt? Eine Matrix? Wie kann ich StaticScore.1 und StaticScore.2 in separate Variablen konvertieren, oder, anders herum, was ist die Notation, um eine neue Variable zu subtrahieren?

Antwort

0

Wir können eine dcast tun ein wide Format von long zu erstellen und diese Spalten subtrahieren die

library(data.table) 
dcast(setDT(Aggregate_Test), ID~paste0("StaticScore", rowid(ID)), value.var="StaticScore" 
      )[, StaticDiff := StaticScore1 - StaticScore2] 

In Bezug auf die spezifische Frage über das Verhalten aggregate ‚StaticDiff‘ zu schaffen, sind wir verketten nur (c) der 'StaticScore' durch 'ID'. Das Standardverhalten ist eine matrix Spalte in aggregate

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 

Dies zu schaffen, indem man die str(StaticAggregate)

str(StaticAggregate) 
#'data.frame': 4 obs. of 2 variables: 
#$ ID   : int 1 2 3 4 
#$ StaticScore: int [1:4, 1:2] 6 7 7 8 5 6 4 5 

geprüft werden Wie wir es in den normalen Spalten ändern?

Es kann mit do.call(data.frame

StaticAggregate <- do.call(data.frame, StaticAggregate) 

Überprüfen Sie die str wieder

str(StaticAggregate) 
#'data.frame': 4 obs. of 3 variables: 
# $ ID   : int 1 2 3 4 
# $ StaticScore.1: int 6 7 7 8 
# $ StaticScore.2: int 5 6 4 5 

Jetzt getan werden, können wir die calcuation tun, wie in den OP der Post zeigte

StaticAggregate$Staticdiff <- with(StaticAggregate, StaticScore.1-StaticScore.2) 
StaticAggregate 
# ID StaticScore.1 StaticScore.2 Staticdiff 
#1 1    6    5   1 
#2 2    7    6   1 
#3 3    7    4   3 
#4 4    8    5   3 
0

Da die str Ausgabe in der Frage angezeigt, StaticAggregate ist ein zweispaltiger Datenrahmen, dessen zweite Spalte eine zweispaltige Matrix ist, StaticScore. Wir können die Matrix so anzuzeigen:

StaticAggregate$StaticScore 
##  [,1] [,2] 
## [1,] 6 5 
## [2,] 7 6 
## [3,] 7 4 
## [4,] 8 5 

Um eine neue Spalte mit dem Unterschied, zu erstellen:

transform(StaticAggregate, diff = StaticScore[, 1] - StaticScore[, 2]) 
## ID StaticScore.1 StaticScore.2 diff 
## 1 1    6    5 1 
## 2 2    7    6 1 
## 3 3    7    4 3 
## 4 4    8    5 3 

Hinweis, dass es keine Spalten in StaticAggregate oder in StaticAggregate$StaticScoreStaticScore.1 und StaticScore.2 benannt.StaticScore.1 in der Überschrift der data.frame-Druckausgabe bezeichnet nur die erste Spalte der StaticScore-Matrix.

Der Grund, dass die Matrix keine Spaltennamen hat, ist, dass die aggregate Funktion c sie nicht erzeugt. Wenn wir die ursprünglichen aggregate dazu dann würden sie Namen ändern:

StaticAggregate2 <- aggregate(StaticScore ~ ID, Aggregate_Test, setNames, c("A", "B")) 
StaticAggregate2 
## ID StaticScore.A StaticScore.B 
## 1 1    6    5 
## 2 2    7    6 
## 3 3    7    4 
## 4 4    8    5 

Jetzt können wir das schreiben die Spaltennamen mit der Matrix:

StaticAggregate2$StaticScore[, "A"] 
## [1] 6 7 7 8 

StaticAggregate2$StaticScore[, "B"] 
## [1] 5 6 4 5 

Beachten Sie, dass es ein signifikanter Vorteil der ist Der Weg von R aggregate funktioniert, da er einen einfacheren Zugriff auf die Ergebnisse ermöglicht - die k-te Spalte der Matrix ist das k-te Ergebnis der Aggregatfunktion. Dies steht im Gegensatz dazu, dass die k + 1ste Spalte des Datenrahmens das k-te Ergebnis der Aggregatfunktion darstellt. Dies mag hier nicht als Vereinfachung erscheinen, aber für komplexere Probleme kann es eine erhebliche Vereinfachung bedeuten, wenn Sie auf die Statistikmatrix zugreifen müssen. Natürlich können Sie es jederzeit zu 3 Spalten abflachen, wenn Sie

do.call(data.frame, StaticAggregate) 

wollen, aber wenn Sie es für eine Weile denken können Sie feststellen, dass die Struktur tatsächlich bequemer bietet ist.

+0

Danke an alle für ihre schnelle Antwort und Hilfe. Es ist hilfreich, die verschiedenen Lösungsansätze zu sehen. Die "do.call" -Funktion scheint zu tun, was ich brauche, indem ich die Matrixspalten in Variablen umwandle. Ich kann nicht viel Dokumentation darüber finden - irgendwelche Vorschläge, wo man hinschauen kann? – Jerry

+0

Wie erwähnt, obwohl die Do.call es abflachen wird, ist es normalerweise nicht wirklich wünschenswert. –

Verwandte Themen