【发布时间】:2017-06-16 15:21:45
【问题描述】:
我是 R 编程新手。
我有两个列表,其中一个列表包含用户名。 另一个列表包含每个用户访问过的页面
用户:AAA BBB CCC DDD
记录:
page 1 AAA
page 2 BBB
page 3 AAA
page 4 BBB
page 1 BBB
page 4 AAA
我需要收集每个用户访问过的所有页面
需要输出:
Pages visited by AAA page1,page 3, page 4
Pages visited by BBB page 2, page4, page 1
我正在尝试将每个用户访问的页面存储在矩阵中
例如,矩阵第 1 行的列将包含用户 1 浏览的页面,依此类推
请看下面我的代码:
k <- 0
out <- matrix(NA, nrow=100, ncol=50) #my final output matrix
for (i in users)
{
k <- k+1
p <- 0
for (j in records)
{
x<-(strsplit(j, "\t"))
if(x[[1]][2]== i) #gather all pages visited by a same user
{
p <- p+1
out[k,p]=c(x[[1]][1])
}
}
x <- 0
#here i need to remove unused columns in row k
}
out <- out[1:(k),] #remove unused rows in a matrix
print (out)
我得到的输出
page1 page3 page4 NA NA NA .... NA
page2 page4 page1 NA NA NA .... NA
需要最终矩阵:
page1 page3 page4
page2 page4 page1
【问题讨论】:
-
你能给出你的两个列表中的reproducible example 吗?如果将这两个列表绑定到一个数据框中,那么一个简单的聚合 (
aggregate(pages ~ user, df, toString)) 应该可以完成这项工作 -
所有用户访问的页面数量都相同吗?如果没有,矩阵将不起作用,因为您需要为每个用户提供不同数量的列。
-
@herbaman 每个用户浏览的页面数不同。现在我明白我的错误是不能使用矩阵,因为它应该是一些固定的行 x 列。您能否提出任何替代方法来实现我的预期解决方案?
-
我一直在研究这个解决方案,但我同意@herbaman,矩阵的列数是固定的,它会影响最终输出。您正在打印 NA ,因为您的矩阵单元格已初始化为没有值。提供最终解决方案的可能方法是:a)用空字符串初始化矩阵或在 out 函数中设置 na.print 标志以将 NA 值可视化为例如。空字符串,或 c) a) 或 b) 的组合,并将矩阵行修剪为单个用户查看的最大页面数
-
您可以使用列表列表,@Sotos 提到的
aggregate(),deplyr 的group_by(),或data.table()。我支持@Sotos,您应该提供一个可重现的数据示例。