2016-07-27 19 views
0

Dies ist ein bisschen eine Denkaufgabe hier - ich könnte dies mit der Hand, aber es muss eine lineare Algebra Weg, dies zu tun.R Extrahieren von Variablen-Mapping aus Tabellenmatrix

Ich habe die Tabellenfunktion, um mit einem Datenrahmen/Matrix verwendet, die die Zählungen des Zufalls zwei Variablen haben:

>table(gfk_data$AnswerID, gfk_data$AnswerText) 


      Very unlikely Unlikely Somewhat likely Very likely 
    1161841    0  0    0  3029 
    1161842    0  0    175   0 
    1161843    0  165    0   0 
    1161844   562  0    0   0 
    1161845    0  0    0   31 
    1161846    0  0    26   0 
    1161847    0  26    0   0 
    1161848   45  0    0   0 

Wie kann ich die Zeilennamen erhalte die Abbildung von AnswerIDs, dem Antworttext sind das sind die Spaltenüberschriften?

Vielleicht ist es einfacher, aus dem ursprünglichen Datenrahmen zu extrahieren?

Das gewünschte Ergebnis wäre so etwas wie:

AnswerID AnswerText 
1161841 Very likely 
1161842 Somewhat likely 
1161843 Unlikely 
... 

Bisher kann ich denke, eine Schleife mit den Werten von Antworttext für jeden answerID in der ursprünglichen Datenrahmen suchen und Einsetzen des unique() dieser Rückkehr in Datenrahmen. Das wird sicherlich funktionieren, aber vielleicht gibt es etwas Eleganteres?

+1

Könnten Sie eine Probe Ihres gewünschten Ergebnisses posten? Was hast du probiert? – bouncyball

Antwort

1

Sie as.data.frame.table() verwenden konnten und die ersten beiden Spalten zu extrahieren, wo die dritte Spalte ist größer als 0:

as.data.frame.table(
    table(gfk_data$AnswerID, gfk_data$AnswerText) 
    )[as.data.frame.table(table(gfk_data$AnswerID, gfk_data$AnswerText))[,3] > 0, c(1,2)] 
+0

Ja, das scheint am einfachsten zu sein. –

0

Hier ist eine Möglichkeit, um es von der Ausgabe oben zu bekommen. Der "Trick" beim Erstellen der ersten Spalte besteht darin, eine Nachschlagetabelle zu verwenden, die die richtigen Zeilennamen um den maximalen Wert für jede Spalte zieht.

dfNew <- data.frame(answerID=rownames(df)[max.col(df)], 
        answerText=names(df), stringsAsFactors=F) 

    answerID  answerText 
1 1161844 Very_unlikely 
2 1161843  Unlikely 
3 1161842 Somewhat_likely 
4 1161841  Very_likely 
5 1161844 Very_unlikely 
6 1161843  Unlikely 
7 1161842 Somewhat_likely 
8 1161841  Very_likely 

. Die data.frame kann umsortiert mit order

dfNew <- dfNew[order(dfNew$answerID),] 
dfNew 
    answerID  answerText 
4 1161841  Very_likely 
8 1161841  Very_likely 
3 1161842 Somewhat_likely 
7 1161842 Somewhat_likely 
2 1161843  Unlikely 
6 1161843  Unlikely 
1 1161844 Very_unlikely 
5 1161844 Very_unlikely 

Daten

df <- read.table(header=T, text="   Very_unlikely Unlikely Somewhat_likely Very_likely 
1161841    0  0    0  3029 
1161842    0  0    175   0 
1161843    0  165    0   0 
1161844   562  0    0   0 
1161845    0  0    0   31 
1161846    0  0    26   0 
1161847    0  26    0   0 
1161848   45  0    0   0") 
0

Ich fand, dass ich die resultierende Matrix in einen Datenrahmen setzen und dann filtern konnte r basierend auf Artikeln Frequenzen größer als 0.

count_df <- as.data.frame(table(gfk_data$AnswerID, gfk_data$AnswerText)) 
count_df[count_df$Freq>1,] 

und die ersten beiden Spalte dieses Datenrahmen würde ich mein gewünschtes Ergebnis

 Var1   Var2 Freq 
4 1161844 Very unlikely 562 
8 1161848 Very unlikely 45 
11 1161843  Unlikely 165 
15 1161847  Unlikely 26 
18 1161842 Somewhat likely 175 
22 1161846 Somewhat likely 26 
25 1161841  Very likely 3029 
29 1161845  Very likely 31 
1

Eine weitere Option @ lmo der df ist

data.frame(answerID=rownames(df),answerText=names(df)[apply(df,1,which.max)]) 
Verwandte Themen