我必须使用2个数据框200万条记录和另外200万条记录。我使用了for循环从彼此获取数据,但是它太慢了。我创建了一个示例来演示我需要做什么。
ratings = data.frame(id = c(1,2,2,3,3),
rating = c(1,2,3,4,5),
timestamp = c("2006-11-07 15:33:57","2007-04-22 09:09:16","2010-07-16 19:47:45","2010-07-16 19:47:45","2006-10-29 04:49:05"))
stats = data.frame(primeid = c(1,1,1,2),
period = c(1,2,3,4),
user = c(1,1,2,3),
id = c(1,2,3,2),
timestamp = c("2011-07-01 00:00:00","2011-07-01 00:00:00","2011-07-01 00:00:00","2011-07-01 00:00:00"))
ratings$timestamp = strptime(ratings$timestamp, "%Y-%m-%d %H:%M:%S")
stats$timestamp = strptime(stats$timestamp, "%Y-%m-%d %H:%M:%S")
for (i in(1:nrow(stats)))
{
cat("Processing ",i," ...\r\n")
temp = ratings[ratings$id == stats$id[i],]
stats$idrating[i] = max(temp$rating[temp$timestamp < stats$timestamp[i]])
}
有人可以为此提供其他选择吗?我知道apply可能有效,但是我不知道如何翻译for函数。
更新:谢谢您的帮助。我正在提供更多信息。
表格统计信息具有质数,句号,用户,id的唯一组合。
表分级具有多个具有不同分级和时间戳记的id记录。
我想做的是以下几点。对于统计信息中找到的每个ID,要查找评级表(ID列)中的所有记录,然后根据同样从统计信息中获得的特定时间戳获得最高评级。
最佳答案
从数据结构的角度来看,您似乎想要合并两个表,然后执行split-group-apply方法。
无需循环检查哪个行属于哪个行,您可以简单地合并两个表(非常类似于SQL中的JOIN语句),然后执行“aaply”类型的方法。我建议您下载“plyr”库。
new_stats = merge(stats, ratings, by='id')
library(plyr)
ddply(new_stats,
c('primeid', 'period', 'user'),
function(new_stats)
c( max(new_stats[as.Date(new_stats$timestamp.x) > as.Date(new_stats$timestamp.y)]$rating )))
如果使用plyr使您感到困惑,请访问此教程:http://www.creatapreneur.com/2013/01/split-group-apply/。