【发布时间】:2016-01-18 15:23:50
【问题描述】:
我正在尝试提高以下进程的计算效率。我已经创建了使用数据进行审查的玩具示例。第一种方法的运行时间是第二种方法的一半。
如何改进第一种方法的运行时间?
library(sqldf)
id = c(1,1,1,1,2,2,2,5,5,5,5,5,5)
qn = c(0,0,1,1,0,1,0,0,0,1,0,1,0)
d = data.frame(cbind(id,qn))
names(d) = c("id", "qn")
un = unique(d$id)
holder = matrix(0,length(un), 1)
counter = 0
x = proc.time()
for (i in un)
{
z = head(which(d[d$id == i,]$qn==1),1)
counter = counter + 1
holder[counter,] = z
}
proc.time() - x
f = sqldf("select id, count(qn) from d group by id", drv = 'SQLite')
f = cbind(f,holder)
#################################
un = unique(d$id)
holder = matrix(0,length(un), 1)
counter = 0
x = proc.time()
for (i in 1:length(un))
{
y = paste("select * from d where id = ", un[i])
y = sqldf(y, drv = 'SQLite')
y = min(which(y$qn==1))
counter = counter + 1
holder[counter,] = y
}
proc.time() - x
f = sqldf("select id, count(qn) from d group by id", drv = 'SQLite')
f = cbind(f,holder)
我正在尝试为每个 id 计算 1 的第一个实例。
预期输出:
# id first
# 1: 1 3
# 2: 2 2
# 3: 5 3
【问题讨论】:
-
最好尝试描述您正在尝试做的事情,而不是仅仅展示您是如何做到的。最终目标是什么?
-
感谢您的快速回复!我尝试为每个 id 计算 1 的第一个实例。