2016-09-05 6 views
5

Ich habe angefangen mit R data.table zu arbeiten und ich versuche folgendes zu tun: Der Einfachheit halber sagen wir, dass ich eine Liste habe wie folgt aus ArticleReadings:R-Datentabelle - Erstelle eine neue Spalte wo jedes Element eine Liste von Werten ist

UserID Time ArticleID Category NumOfReading 
'aaa'  7:50 'x'  'sports' 1 
'bbb'  5:05 'x'  'sports' 1 
'aaa'  8:40 'y'  'politics' 2 
'aaa'  10:00 'z'  'sports' 3 

Schließlich würde ich eine neue Spalte möchten, die eine Liste aller Kategorien zu lesen von einem bestimmten Benutzer enthält. In diesem Beispiel ist der Wert für den Benutzer 'aaa' ein Vektor aus 'politics', 'sports' und für den Benutzer 'bbb' ist es ein Vektor mit einem Element: 'sport'. Ich möchte diese Art von Spalte, weil später möchte ich einige Manipulationen (z. B. berechnen Sie die Modus/dominante Kategorie, oder zeigen Sie die beliebten Kombinationen von Kategorien), so dachte ich, zuerst einen eindeutigen Vektor für jeden Benutzer zu bekommen, dann sortiere es. Alle meine Versuche, solche Funktionen wie der neue Wert der Spalte zu haben, führten dazu, die Vektorwerte für jedes Element einzeln einzustellen, und nicht einen Vektor als Spaltenwert .... zum Beispiel eine meiner Versuche:

CategoriesList <- function(x){sort(unique(x))} 
DT[,':='(UniqueCats=CategoriesList(Category)),by=userID] 

Da ich neu in data.table und zu benutzerdefinierten Funktionen in R bin, schätze ich, dass mir einige kritische Punkte in Bezug auf die Übertragung des Ergebnisses auf einen Vektor fehlen ... Jede Hilfe wäre willkommen!

+0

Ihre 'CategoriesList' ist nicht eine 'list' und auch die Anzahl der' unique' Elemente ist nicht gleich der Anzahl der Zeilen für jede 'userID' Sie können versuchen mit 'DT [, uniqueCats: = toString (sort (unique (Category))), UserID] ' – akrun

Antwort

5

Wenn wir eine list Spalte im Datensatz müssen, wickeln Sie es mit list

DT[, UniqueCats := list(list(sort(unique(Category)))) , by = UserID] 
str(DT) 
#Classes ‘data.table’ and 'data.frame': 4 obs. of 6 variables: 
# $ UserID  : chr "aaa" "bbb" "aaa" "aaa" 
# $ Time  : chr "7:50" "5:05" "8:40" "10:00" 
# $ ArticleID : chr "x" "x" "y" "z" 
# $ Category : chr "sports" "sports" "politics" "sports" 
# $ NumOfReading: int 1 1 2 3 
# $ UniqueCats :List of 4 
# ..$ : chr "politics" "sports" 
# ..$ : chr "sports" 
# ..$ : chr "politics" "sports" 
# ..$ : chr "politics" "sports" 

Wir können auch eine String-Spalte erstellen, indem Sie die Elemente miteinander verketten mit paste

DT[, uniqueCats := toString(sort(unique(Category))), by = UserID] 
Verwandte Themen