2016-09-05 21 views
5

Zacząłem pracować z R data.table i próbuję wykonać następujące czynności: Dla uproszczenia załóżmy, że mam listę ArtykułRozszerzenia:Tabela danych R - utwórz nową kolumnę, w której każdy element jest listą wartości

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 

Ostatecznie chciałbym nową kolumnę, która będzie zawierać listę wszystkich kategorii czytanych przez określonego użytkownika. W tym przykładzie wartość dla użytkownika "aaa" będzie wektorem "polityki", "sportu", a dla użytkownika "bbb" będzie to wektor z jednym elementem: "sport". Chcę tego typu kolumny, ponieważ później chciałbym mieć pewne manipulacje na nim (np. Obliczyć kategorię Mode/dominant lub wyświetlić popularne kombinacje kategorii), więc pomyślałem, aby najpierw uzyskać unikalny wektor dla każdego użytkownika, następnie posortuj to. Wszystkie moje testy mające takie funkcje, jak nowa wartość kolumny, spowodowały ustawienie wartości wektora oddzielnie dla każdego elementu, a nie wektor jako wartość kolumny .... Na przykład jedno z moich prób:

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

Ponieważ jestem nowy w data.table i funkcji zdefiniowanych przez użytkownika w R, domyślam się, że brakuje mi jakiegoś krytycznego punktu dotyczącego przeniesienia wyniku do wektora ... Każda pomoc będzie doceniona!

+0

Twój 'CategoriesList' jest nie "lista", a także liczba "unikalnych" elementów nie będzie równa liczbie wierszy dla każdego "ID użytkownika" Możesz spróbować z 'DT [, uniqueCats: = toString (sort (unique (Category)), ID użytkownika] ' – akrun

Odpowiedz

5

Jeśli potrzebujemy kolumnę w zbiorze list, owinąć go 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" 

Możemy również utworzyć kolumnę ciąg przez łączenie elementów razem z paste

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