可能重复:
Why are loops slow in R?
考虑以下任务。数据集有20,000个“用户”的变量。每个用户有1到150个观察值。所有用户都堆叠在一个称为数据的矩阵中。第一列是用户的id并标识用户。所有id都存储在名为userid的20,000 X 1矩阵中。
考虑以下R代码
useridl = length(userid)
itime=proc.time()[3]
for (i in 1:useridl) {
temp =data[data[,1]==userid[i],]
}
etime=proc.time()[3]
etime-itime
此代码仅通过20,000个用户,每次都创建临时矩阵。使用属于userid [i]的观察子集。在MacPro中大约需要6分钟。
在MatLab中,同样的任务
tic
for i=1:useridl
temp=data(data(:,1)==userid(i),:);
end
toc
需要1分钟。
为什么R这么慢?这是标准任务,我在两种情况下都使用矩阵。有什么想法吗?
答案 0 :(得分:6)
正如@joran评论的那样,这是糟糕的R练习。不要重复对原始矩阵进行子集化,只需将子集放入列表中一次,然后使用lapply
或类似内容迭代列表。
# make example data
set.seed(21)
userid <- 1:1e4
obs <- sample(150, length(userid), TRUE)
users <- rep(userid, obs)
Data <- cbind(users,matrix(rnorm(40*sum(obs)),sum(obs),40))
# reorder so Data isn't sorted by userid
Data <- Data[order(Data[,2]),]
# note that you have to call the data.frame method explicitly,
# the default method returns a vector
system.time(temp <- split.data.frame(Data, Data[,1])) ## Returns times in seconds
# user system elapsed
# 2.84 0.08 2.92
我的猜测是垃圾收集器正在减慢你的R代码,因为你不断覆盖temp
对象。