2016-09-24 2 views
1

Ich habe folgende Datenstruktur:R: wie Median und Vereinbarung Funktion für mehrere Gruppen erstellen

 Player Team Round Question Answer 
1:  2 1  1  1  1 
2:  5 1  1  1  1 
3:  8 1  1  1  1 
4:  9 1  1  1  1 
5:  10 1  1  1  1 
6:  2 1  1  2  4 
7:  5 1  1  2  5 
8:  8 1  1  2  5 
9:  9 1  1  2  5 
10:  10 1  1  2  5 
11:  2 1  1  4  4 
12:  5 1  1  4  3 
13:  8 1  1  4  4 
14:  9 1  1  4  2 
15:  10 1  1  4  4 
16: ... 

So gibt es mehrere Spieler aus verschiedenen Teams, einige Fragen zu beantworten. Es gibt immer 2 Spielrunden.

Was ich versuche zu berechnen, ist das Medium und der Übereinstimmungskoeffizient (siehe agrmt package) aus den Daten durch Gruppierung des Teams und der Frage.

wie das Ergebnis aussehen soll:

 Team Question Median_R1 Agrmt_R1 Median_R2 Agrmt_R2 
1:  1  1   1  1   1  1 
2:  1  2   2  0.83   1  1 
3:  ... 
4:  5  10   4  1   4  1 

Kennt jemand, ob dies möglich ist? Ich konnte dafür keine Lösung finden. Ich kann den Median und den Übereinstimmungskoeffizienten eigenständig lösen, aber nicht kombiniert?

Jeder Hinweis ist willkommen. Vielen Dank.

UPDATE:
Die Vereinbarung Funktion Die Werte stellen einen Koeffizienten zwischen -1 und 1 zurück.

  • 1 steht für eine vollständige Übereinstimmung (z. B. wenn jeder Spieler 5 antwortet).
  • 0 wäre, wenn jeder Spieler eine andere Antwort hat.
  • -1 wäre, wenn eine Meinungsverschiedenheit besteht (einige Spieler sagen Antwort 1 und andere 5 sagen)

enter image description here

die Median Vergleich einen Vektor des Frequenzvektor nehmen die Vereinbarung Funktionen.

Zum Beispiel haben wir die folgenden Antworten

 Player Team Round Question Answer 
6:  2 1  1  2  4 
7:  5 1  1  2  5 
8:  8 1  1  2  5 
9:  9 1  1  2  5 
10:  10 1  1  2  5 

Die Funktionseingänge würde wie folgt aussehen:
Median-Eingang: 4,5,5,5,5 -> Ergebnis: 5
Vereinbarung Eingang: 0,0,0,1,4 -> Ergebnis:

0,9

UPDATE 2: behobenes

die Berechnung der Vereinbarung könnte mit dem folgenden Code gemacht werden:

agreement(table(factor(x, levels=1:5))) 

Das Finale basiert auf @sandipan Implementierung. Ich musste einen weiteren Sortierschritt hinzufügen, um die richtigen Daten zu kombinieren.Frames:

library(agrmt) 
df1 <- unique(df[c('Party', 'Question')]) 
for (df.R in split(df, df$Round)) { 
    round <- unique(df.R$Round) 
    # get the data.frame of the current Round. 
    df2 <- as.data.frame(as.list(aggregate(Answer ~ Party + Question + Round, 
      df.R, FUN = function(x) c(Median = median(x), Agrmt = agreement(table(factor(x, levels=1:5))))))) 
    # sort it and take only the columns of median and agreement 
    df3 <- df2[with(df2, order(Party, Question)),][4:5] 
    names(df3) <- c(paste('Median_R', round, sep=''), paste('Agrmt_R', round, sep='')) 
     df1 <- cbind.data.frame(df1, df3) 
} 

df1 

Vielen Dank für die Hilfe.

+1

Anstatt uns zu bitten, das agrmt-Paket Vignette durchzulesen, teilen Sie uns einfach mit, welche Funktion Sie für die Berechnung der Vereinbarung verwenden möchten. – eipi10

Antwort

1

Hier sind drei Ansätze: Basis R aggregate, dplyr und data.table.

Mit Grund R aggregate:

library(agrmt) 

aggregate(Answer ~ Team + Round + Question, data=dat, 
      FUN = function(x) { 
      c(Median=median(x), 
       Agreement=agreement(table(factor(x, levels=1:5)))) 
      }) 
Team Round Question Answer.Median Answer.Agreement 
1 1  1  1   1.0    1.0 
2 1  1  2   5.0    0.9 
3 1  1  4   4.0    0.7 

Mit dplyr:

library(dplyr) 

dat.summary = dat %>% group_by(Team, Round, Question) %>% 
    summarise(Median=median(Answer), 
      Agreement=agreement(table(factor(Answer, levels=1:5)))) 
Team Round Question Median Agreement 
1  1  1  1  1  1.0 
2  1  1  2  5  0.9 
3  1  1  4  4  0.7 

Mit data.table:

library(data.table) 

dat.summary = setDT(dat)[, list(Median=median(Answer), 
           Agreement=agreement(table(factor(Answer, levels=1:5)))), 
         by=list(Team, Round, Question)] 
Team Round Question Median Agreement 
1: 1  1  1  1  1.0 
2: 1  1  2  5  0.9 
3: 1  1  4  4  0.7 

Um eine "breit" Datenrahmen als die endgültige Ausgabe:

In den obigen Beispielen I habe den Ausgang im "langen" Format belassen. Wenn Sie in das "Wide" -Format umwandeln möchten, so dass jeder Round seine eigenen Spalten erhält, können Sie Folgendes tun:

Zuerst fügen wir eine zweite Runde zu den Beispieldaten hinzu, indem Sie eine weitere Kopie des Beispiels stapeln Daten:

library(dplyr) 
library(reshape2) 
library(agrmt) 

dat = bind_rows(dat, dat %>% mutate(Round=2)) 

nun den Median und Vereinbarung mit dem gleichen Code berechnen wir zuvor in dem dplyr Beispiel verwendet:

dat.summary = dat %>% 
    group_by(Team, Round, Question) %>% 
    summarise(Median=median(Answer), 
      Agreement=agreement(table(factor(Answer, levels=1:5)))) 

schließlich auf breit~~POS=TRUNC neu zu gestalten. Dazu müssen die Daten zuerst "geschmolzen" werden, um die Spalten Median und Agreement in einer einzigen Spalte zu stapeln und dann in das Großformat zu konvertieren. Wir schließen auch die zweite Zeile des Codes „Round“ zu jedem Round hinzuzufügen, so dass wir die Spaltennamen wollen wir in der breiten Datenrahmen erhalten:

dat.summary = dat.summary %>% 
    mutate(Round = paste0("Round", Round)) %>% 
    melt(id.var=c("Team","Question","Round")) %>% 
    dcast(Team + Question ~ variable + Round, value.var="value") 
Team Question Median_Round1 Median_Round2 Agreement_Round1 Agreement_Round2 
1 1  1    1    1    1.0    1.0 
2 1  2    5    5    0.9    0.9 
3 1  4    4    4    0.7    0.7 
1

Ich glaube, Sie wollen etwas wie folgt, oder?

df 
    Player Team Round Question Answer 
1:  2 1  1  1  1 
2:  5 1  1  1  1 
3:  8 1  1  1  1 
4:  9 1  1  1  1 
5:  10 1  1  1  1 
6:  2 1  1  2  4 
7:  5 1  1  2  5 
8:  8 1  1  2  5 
9:  9 1  1  2  5 
10:  10 1  1  2  5 
11:  2 1  1  4  4 
12:  5 1  1  4  3 
13:  8 1  1  4  4 
14:  9 1  1  4  2 
15:  10 1  1  4  4 
16:  2 1  2  1  2 
17:  5 1  2  1  3 
18:  8 1  2  1  4 
19:  2 1  2  2  5 
20:  5 1  2  2  3 
21:  8 1  2  2  1 
22:  2 1  2  4  6 
23:  5 1  2  4  1 
24:  8 1  2  4  5 

library(agrmt) 
df1 <- unique(df[c('Team', 'Question')]) 
for (df.R in split(df, df$Round)) { 
    round <- unique(df.R$Round) 
    df2 <- as.data.frame(as.list(aggregate(Answer ~ Team + Question + Round, 
      df.R, FUN = function(x) c(Median = median(x), Agrmt = agreement(x)))))[4:5] 
    names(df2) <- c(paste('Median_R', round, sep=''), paste('Agrmt_R', round, sep='')) 
    df1 <- cbind.data.frame(df1, df2) 
} 

df1 
    Team Question Median_R1 Agrmt_R1 Median_R2 Agrmt_R2 
1:  1  1   1 0.00000000   3 0.2222222 
6:  1  2   5 0.04166667   3 0.4444444 
11: 1  4   4 -0.05882353   5 -0.5833333 
+0

Sieht sehr gut aus. Das einzige Problem ist, dass die Vereinbarungsfunktionen nicht korrekt funktionieren. Ich nehme an, das Problem ist, dass ein Frequenzvektor benötigt wird (siehe aktualisierte Beschreibung). – tstuber

Verwandte Themen