2017-03-21 5 views
0

ich einen Datenrahmen als solche haben:Reshape Datenrahmen haben Werte von Gruppen Spalten sein

Partner Item 
     A  ab 
     A  ac 
     A  ad 
     A  ed 
     B  ol 
     B  le 
     C  ef 
     E  ab 
     E  ol 
     E  ef 
     E  at 
     E  ok 

Ich möchte dies konvertieren:

Partner Col1 Col2 Col3  Col4 Col5  
     A  ab  ac  ad  ed 
     B  ol  le 
     C  ef 
     E  ab  ol  ef  at  ok 

Aus irgendeinem Zusammenhang ich sein werde mit das Paket arules, um meinen Datenrahmen in Transaktionsklasse umzuwandeln, um den apriori Algorithmus aufzurufen.

Die Art, wie ich dies tun möchte, ist, den ursprünglichen Datenrahmen als solcher zu konvertieren. Speichern Sie es als separate Datei und rufen Sie es dann erneut unter Verwendung von read.transactions auf.

Jede Hilfe wäre großartig, danke!

Antwort

1

Sie möchten für diesen dcast verwenden. Wenn Sie einen großen Datensatz haben, checken Sie in der Datei data.tac aus. Ansonsten wird die in reshape2 gut funktionieren.

library(reshape2) 
df2 = dcast(df, Partner ~ Item, value.var = "Item") 

Dies wird uns dann

Partner ab ac ad at ed ef le ok ol 
1  A ab ac ad <NA> ed <NA> <NA> <NA> <NA> 
2  B <NA> <NA> <NA> <NA> <NA> <NA> le <NA> ol 
3  C <NA> <NA> <NA> <NA> <NA> ef <NA> <NA> <NA> 
4  E ab <NA> <NA> at <NA> ef <NA> ok ol 

geben wir die Spaltennamen nur festlegen müssen und mit „in der NAs füllen“

colnames = paste("Col",1:length(unique(df$Item)), sep = "") 
colnames(df2) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = "")) 
df2[is.na(df2)] <- "" 

    Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 
1  A ab ac ad  ed      
2  B         le  ol 
3  C       ef    
4  E ab    at  ef  ok ol 

So sortieren Sie etwas tun könnte, wie dies

tmp = df2[, 2:ncol(df2)] 
tmp = t(apply(tmp, 1, sort, decreasing = TRUE)) 

df3 = cbind.data.frame(df2[,1],tmp) 
colnames(df3) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = "")) 

> df3 

    Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 
1  A ed ad ac ab       
2  B ol le         
3  C ef           
4  E ol ok ef at ab  

Dort ist wahrscheinlich eine effizientere Art, das zu tun. Übernehmen verwandelt den DF in eine Matrix zum Sortieren. Ich bin mir nicht sicher, wie ich das machen soll, ohne das zu benutzen.

+0

das ist großartig @Kristallersen. Wie würdest du es so sortieren, dass alles von links nach rechts gelesen wird und keine Leerzeichen auf der linken Seite? Also die endgültige Ausgabe sieht aus wie meine endgültige Ausgabe –

+0

@NickKnauer Ich habe eine Methode zum Sortieren hinzugefügt. Es gibt wahrscheinlich einen besseren Weg, aber das könnte ich mir vorstellen. – Kristofersen

Verwandte Themen