【发布时间】:2015-08-04 09:08:00
【问题描述】:
我是 R 新手,正在尝试解决以下问题:
有一个表,其中包含两列 books 和 readers 这些书籍,其中 books 和 readers 分别是书籍和读者 ID:
> books = c (1,2,3,1,1,2)
> readers = c(30, 10, 20, 20, 10, 30)
> bt = data.table(books, readers)
> bt
books readers
1: 1 30
2: 2 10
3: 3 20
4: 1 20
5: 1 10
6: 2 30
对于每一对书,我需要使用以下算法计算阅读这两本书的读者人数:
for each book
for each reader of the book
for each other_book in books of the reader
increment common_reader_count ((book, other_book), cnt)
为了实现上述算法,我需要将这些数据分成两个列表:1)包含每本书的读者的图书列表和 2)包含每个读者阅读的图书的读者列表,例如:
> bookList = list(
+ list(1, list(30, 20, 10)),
+ list(2, list(10, 30)),
+ list(3, list(20))
+ )
>
> readerList = list (
+ list(30, list(1,2)),
+ list(20, list(3,1)),
+ list(10, list(2,1))
+ )
>
问题:
1) 使用什么函数从书表中构建这些列表?
2) 从bookList 和readerList 如何生成阅读这两本书的读者数量的书对?对于上述bt book 表,结果应该是:
((1, 2), 2)
((1,3), 1)
((2,3), 0)
成对书籍的顺序无关紧要,因此,例如,(1,2) 和 (2,1) 应该减少到其中之一。
请提供解决此问题的函数和数据结构。谢谢!
更新:
理想情况下,我需要得到一个矩阵,其中书籍 ID 既作为行又作为列。交集是阅读该对中两本书的读者的计数。所以对于上面的例子矩阵应该是:
books | 1 | 2 | 3 |
1 | 1 | 2 | 1 |
2 | 2 | 1 | 0 |
3 | 1 | 0 | 1 |
Which means:
book 1 and 2 are read together by 2 readers
book 1 and 3 are read together by 1 reader
book 2 and 3 are read together by 0 readers
如何构建这样的矩阵?
【问题讨论】:
-
1-1、2-2、3-3不应该是每本书的读者人数(即分别为3、2、1)吗?
-
在提供代码时,如果它可以复制粘贴会更好,你知道,在行首没有
>和+。
标签: r group-by iteration data.table