R中的循环特定太慢

Mic*_*ael 3 r

我必须使用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]])
}
Run Code Online (Sandbox Code Playgroud)

有人可以为我提供替代方案吗?我知道apply可能有效,但我不知道如何翻译for函数.

更新:谢谢你的帮助.我正在提供更多信息.

表统计信息具有primeid,period,user,id的唯一组合.表评级具有多个具有不同评级和时间戳的id记录.

我想做的是以下内容.对于在统计数据中找到的每个ID,要查找评级表(id列)中的所有记录,然后根据从统计数据获得的特定时间戳获得最大评级.

rrs*_*rrs 6

我喜欢plyr,Hadley Wickham创造的大多数工具,但我发现它可能会非常缓慢,特别是如果我试图分裂ID字段.当发生这种情况时,我转向sqldf.我通常加速20倍.

首先我需要使用lubridate因为类型上的sqldf扼流圈POSIXlt:

library(lubridate)
ratings$timestamp = ymd_hms(ratings$timestamp)
stats$timestamp = ymd_hms(stats$timestamp)
Run Code Online (Sandbox Code Playgroud)

像Vincent那样合并数据帧,并删除违反日期约束的数据帧:

tmp <- merge(stats, ratings, by="id")
tmp <- subset(tmp, timestamp.y < timestamp.x )
Run Code Online (Sandbox Code Playgroud)

最后,获取每个ID的最大评级:

library(sqldf)
sqldf("SELECT *, MAX(rating) AS rating FROM tmp GROUP BY id")
Run Code Online (Sandbox Code Playgroud)