2016-09-05 29 views
5

Tôi đã bắt đầu làm việc với dữ liệu R.t.tôi và tôi đang cố gắng làm như sau: Để đơn giản, giả sử tôi có danh sách of ArticleReadings như sau:Bảng dữ liệu R - tạo cột mới trong đó mỗi phần tử là danh sách các giá trị

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 

Cuối cùng tôi muốn một cột mới chứa danh sách tất cả các danh mục được đọc bởi một người dùng cụ thể. Trong ví dụ này, giá trị cho người dùng 'aaa' sẽ là vectơ 'chính trị', 'thể thao' và đối với người dùng 'bbb', nó sẽ là một vectơ có một yếu tố: 'thể thao'. Tôi muốn loại cột này vì sau này tôi muốn có một số thao tác trên nó (ví dụ: tính toán loại Chế độ/chi phối hoặc hiển thị các loại kết hợp phổ biến), vì vậy tôi nghĩ đầu tiên sẽ nhận được một vector duy nhất cho mỗi người dùng, sau đó sắp xếp nó. Tất cả các thử nghiệm của tôi có các chức năng như giá trị mới của cột dẫn đến việc đặt giá trị vectơ riêng biệt cho từng phần tử và không phải là vectơ làm giá trị cột .... chẳng hạn, một trong các thử nghiệm của tôi:

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

Vì tôi mới dùng data.table và các hàm do người dùng định nghĩa trong R, tôi đoán rằng tôi đang thiếu một số điểm quan trọng liên quan đến việc chuyển kết quả sang vectơ ... Mọi trợ giúp sẽ được đánh giá cao!

+0

của bạn 'CategoriesList' là không phải là một 'danh sách' và số lượng các phần tử' unique' sẽ không bằng số hàng cho mỗi 'userID' Bạn có thể thử với 'DT [, uniqueCats: = toString (sắp xếp (duy nhất (Danh mục))), UserID] ' – akrun

Trả lời

5

Nếu chúng ta cần một cột list trong tập dữ liệu, quấn nó với 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" 

Chúng tôi cũng có thể tạo một cột chuỗi bằng cách kết hợp các yếu tố cùng với paste

DT[, uniqueCats := toString(sort(unique(Category))), by = UserID] 
Các vấn đề liên quan