我需要使用两个数据框,每个数据框有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函数。
更新:感谢帮助。我提供更多信息。
表stats具有primeid、period、user、id的唯一组合。 表ratings有多个id记录,具有不同的评分和时间戳。
我想要做的是:对于在stats中找到的每个id,在ratings表中查找所有记录(id列),然后根据从stats获得的特定时间戳获取最大评分。
temp
的定义“嵌入”到你想要使用的ratings
子集中,并用单个公式完成整个过程。顺便问一下,stats$id
的每个元素都能在ratings$id
中找到吗?但是一些ddply
专家会提出更好的方法。编辑:在向量公式中使用pmax
。 - Carl Witthoftxts
和zoo
也可能是一个好主意。 - Paul Hiemstra