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

标签 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 中的用户定义函数的新手,我想我在将结果传输到向量方面遗漏了一些关键点......
任何帮助,将不胜感激!

最佳答案

如果我们需要 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]

关于R 数据表 - 创建一个新列,其中每个元素都是一个值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39329750/

相关文章:

R:从数据计数生成直方图

r - data.table 用 NA 替换一个值

r - 聚合和 DCast

r - 与 R 中的日期相关联的条件累积和

c++ - 在具有结构的 vector 中获取项目位置

r - 如何沿非NA元素创建向量序列

r - NLME 回归的限制?

r - 在不影响 R 代码块输出的情况下,我可以在使用 Markdown 和 knitr 时更改 MS Word Normal 样式吗

arrays - 访问数组的元素和因子

c++ - 从迭代器返回对象的引用