【发布时间】:2013-03-29 00:20:21
【问题描述】:
Windows 7 上的 R 版本 2.11.1 32 位
我得到如下数据 train.txt:
USER_A USER_B ACTION
1 7 0
1 8 1
2 6 2
2 7 1
3 8 2
我按照以下算法处理数据:
train_data=read.table("train.txt",header=T)
result=matrix(0,length(unique(train_data$USER_B)),2)
result[,1]=unique(train_data$USER_B)
for(i in 1:dim(result)[1])
{
temp=train_data[train_data$USER_B%in%result[i,1],]
result[i,2]=sum(temp[,3])/dim(temp)[1]
}
结果是train_data中每个USER_B的分数。分数定义为:
USER_B的得分=(USER_B的所有ACTION之和)/(USER_B的推荐次数)
但是train_data非常大,我可能需要三天才能完成这个程序,所以我来这里寻求帮助,这个算法可以改进吗?
【问题讨论】:
-
我的猜测是,您应该能够通过矢量化代码来完全避免 for 循环。
-
一些关于您的代码的指针。行尾不需要
;- R 是 not C! ;-) 你不需要初始化ifor()调用会为你做这件事,同样也不需要在循环结束时增加i。编写for(i in seq_len(nrow(result)))也比手动生成序列更好,尤其是在生产代码中。 -
顺便问一下,你的数据集有多大 - 试试
nrow(train_data)。如果它超过可用 RAM 的一半,请小心。如果发生这种情况,请查看bigmemory及其相关函数/包:bigsplit、mwhich和bigtabulate。
标签: r