R数据表 - 创建一个新列,其中每个元素都是值列表

时间:2016-09-05 11:35:38

标签: r vector data.table user-defined-functions

我已经开始使用R data.table了,我正在尝试执行以下操作: 为简单起见,我们假设我有一个ArticleReadings列表如下:

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

最终我想要一个新列,其中包含特定用户读取的所有类别的列表。在这个例子中,用户'aaa'的值将是'politics','sports'的向量,对于用户'bbb',它将是一个带有一个元素的向量:'sports'。 我想要这种类型的列,因为后来我想对它进行一些操作(例如计算模式/显性类别,或显示流行的类别组合),所以我想先为每个用户获取一个唯一的向量,然后解决。 我的所有试验都具有列的新值等功能,导致为每个元素分别设置矢量值,而不是矢量值作为列值.... 例如,我的一个试验:

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

由于我是data.table和R中的用户定义函数的新手,我想我错过了将结果传递给向量的一些关键点... 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:6)

如果我们在数据集中需要list列,请使用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"

我们还可以通过将元素与paste

连接在一起来创建字符串列
DT[, uniqueCats := toString(sort(unique(Category))), by = UserID]