【发布时间】:2012-10-18 23:16:31
【问题描述】:
我有一个working solution 来解决我的问题,但我无法使用它,因为它太慢了(我的计算预测整个模拟需要 2-3 年!)。因此,我正在寻找更好(更快)的解决方案。这是(本质上)我正在使用的代码:
N=4
x <-NULL
for (i in 1:N) { #first loop
v <-sample(0:1, 1000000, 1/2) #generate data
v <-as.data.frame(v) #convert to dataframe
v$t <-rep(1:2, each=250) #group
v$p <-rep(1:2000, each=500) #p.number
# second loop
for (j in 1:2000) { #second loop
#count rle for group 1 for each pnumber
x <- rbind(x, table(rle(v$v[v$t==1&v$p==j])))
#count rle for group 2 for each pnumber
x <- rbind(x, table(rle(v$v[v$t==2&v$p==j])))
} #end second loop
} #end first loop
#total rle counts for both group 1 & 2
y <-aggregate(x, list(as.numeric(rownames(x))), sum)
简而言之:代码生成抛硬币模拟 (v)。生成一个组因子(1 和 2)。生成一个 p.number 因子 (1:2000)。记录第 1 组和第 2 组的每个 p.number (1:2000) 的运行长度(每个 p.number 在两个组中都有运行)。在N 循环(第一个循环)之后,总运行长度显示为一个表(聚合)(即,每个组的运行长度,对于每个 p.number,超过N 循环的总和)。
我需要第一个循环,因为我正在处理的数据来自单独的文件(所以我正在加载文件,计算各种统计数据等,然后加载下一个文件并执行相同的操作)。我不太喜欢第二个循环,但不知道如何用更快的东西替换它。
可以对第二个循环做些什么来使它(希望,很多)更快?
【问题讨论】:
-
为什么你将
rle分别用于v$t和v$p的值,并在创建y时删除所有这些信息? -
更多指针:1) 不要为
v使用数据框,它们本来就很慢。我只需要普通向量vt <-rep(1:2, each=250)和vp <-rep(1:2000, each=500)。那么你就不需要那么多的子集了。在rle()电话中。 -
@SvenHohenstein 因为我对它们不感兴趣,只是将它们放在一起。另外,这是我工作的一个元素,我正在以其他方式使用这些数据。
-
我并不认为这是一个借口——我不是程序员(我是一名地理学家,与社会科学家非常接近),但我已经学会了如何使用我选择的工具, R, 有效。关于
rle()和table()位,我怀疑这里是否有任何容易实现的目标,它们将更接近您的舒适区。我要指出的是是容易实现的结果,它可能会在不弄脏手优化内部循环的情况下产生错误。 -
总而言之,因此请不要将其视为对 OP 的攻击:任何科学家、工程师或社会学家根本不可能在不知道如何在现代环境中工作编写和使用软件。我对我公司的 EE 和光学工程师也说了同样的话。必要时参加培训课程,但不要以为不知道如何编写代码就可以生存。