2013-02-08 115 views
-1

我正在做一些小的计算和我决定来一补data.table里面的数据,因为它比data.framerbind快得多当奇怪的错误有R使用data.table

所以基本上我的代码是类似的东西:

df是用于计算的data.frame,但它的含义很重要。

l=12000 
dti = 1 
dt = data.table(ni = 0, nj = 0, regerr = 0) 
for (i in seq(1,12000,200)) { 
    for (j in seq(1, 12000, 200)) { 
     for (ind in 1:nrow(df)) { 
      if(i+j >= l/2){ 
       df[ind,]$X = df[ind,]$pos * 2 
      } else { 
       df[ind,]$X = df[ind,]$pos/l 
      } 
     } 
     for (i in 1:100) { # 100 sample 
      sample(df$X,nrow(df), replace=FALSE) 
      fit=lm(X ~ gx, df) #linear regression calculation 
      regerror=sum(residuals(fit)^2) 

      print(paste(i,j,regerror)) 
      set(dt,dti,1L,as.double(i))    
      set(dt,dti,2L,as.double(j))    
      set(dt,dti,3L,regerror)    
      dti=dti+1 

     } 
    } 
} 

的代码打印前几轮的print(paste(i,j,regerror))然后将它与这个错误退出:

*** caught segfault *** 
address 0x3ff00008, cause 'memory not mapped' 
Segmentation fault (core dumped) 

编辑

structure(list(ax = c(-0.0242214, 0.19770304, 0.01587302, -0.0374415, 
0.05079826, 0.12209738), gx = c(-0.3913043, -0.0242214, -0.4259067, 
-0.725, -0.0374415, 0.01587302), pos = c(11222, 13564, 16532, 
12543, 12534, 14354)), .Names = c("ax", "gx", "pos"), row.names = c(NA, 
-6L), class = "data.frame") 

任何想法表示赞赏。

+0

@Arun其中由我一个错误,书写时的问题,但基本功能计算这个循环里面的东西(它是写我计算的东西)的两个I指数,然后我洗牌,对洗牌数据进行回归,然后保存在data.table – ifreak 2013-02-08 14:41:19

+2

如果您想提供[可重现的代码](http://stackoverflow.com/questions/5963269/how-to-make-a-伟大的 - 可重现的例子)我想你可能会得到答案。我相信三个for循环并不是你所做的最有效的技术。就目前而言,我不能完全了解那里发生的事情,而不知道“df”是什么,并且至少知道一些关于你最内层for循环中发生的事情。 – Justin 2013-02-08 15:06:12

+0

@Justin我已经更新了我的问题与df数据框和最内层循环内的代码.. – ifreak 2013-02-08 15:21:57

回答

4

没有听起来没有意义的粗鲁,我想你可能会从阅读一些R教程中获益,然后继续前进。这个问题也很可能因为本地化而关闭。此外,seg faults几乎总是一个地方的错误,但你可以通过理解你的每一段代码在做什么来避免一堆这样的头痛。自上周五,通过它的一些可以让步行:

if(i+j >= l/2){ 
    data[ind,]$X = df[ind,]$pos * 2 
} 
else{ 
    data[ind,]$X = df[ind,]$pos/l 
} 

我会假设data,就是要df从那里走。我们位于ij的两个循环中,这两个循环都从1到20000.他们永远不会低于1/2,因此您将始终执行第一条语句。此外,如果你曾经预期FALSE情况发生,你需要else在同一线路上,大括号:

if (i + j >= 1/2) { 
    df$X <- df$pos * 2 
} else { 
    df$X <- df$pos 
} 

R的矢量这样做上述相同,通过每一个值循环和乘以2.我也删除了/ 1声明,因为它没有做任何事情。整个部分可以移到循环之外。由于其添加列X的恒定操作是列pos的两倍。

接下来,你的循环,你做一个适合:

for (i in 1:100) { # 100 sample 
    sample(df$X,nrow(df), replace=FALSE) 
    fit=lm(X ~ gx, df) #linear regression calculation 
    regerror=sum(residuals(fit)^2) 

    print(paste(i,j,regerror)) 
    set(dt,dti,1L,as.double(i))    
    set(dt,dti,2L,as.double(j))    
    set(dt,dti,3L,regerror)    
    dti=dti+1 
} 

服用,sample(df$X, nrow(df), replace=FALSE)只会显示你的新秩序。它并不实际分配它们。而是df$X <- sample(df$X, nrow(df), replace=FALSE)。现在

,它看起来像你要分配到dtdti行(这一点很像df的功能,应该避免作为变量名)该拟合误差以及您indicies的结果呢?据我所知,没有什么取决于ij。相反,你会执行一个随机排序的适合60 * 60 * 100次......如果这就是你想要做的,尽一切努力吧!而是做有效率的方式:

df$X <- df$pos * 2 
fit.fun <- function(n, dat) { 
    jumble <- sample(nrow(dat)) 
    dat$X <- dat$X[jumble] 
    sum(residuals(lm(X ~ gx, dat))^2) 
} 

sapply(1:10, fit.fun, dat=df) 
+0

感谢您的回复,但首先您提到的1不是'1它的l',其次这只是一个测试脚本,我想要实现的实际想法更复杂,你不能使用vecotrized的东西..因为它包括其他函数,将'X到DF'和有关抽样,是你提到的是什么我想要做..但我的问题是,60 * 60 * 100没有被填充在'data.table'里面,而是我得到了我复制的错误 – ifreak 2013-02-08 16:00:13

+0

我建议你将问题分解成可管理的块,特别是导致错误的部分。然后朝着一个最小可重现的例子工作,这个例子仍然会给出错误,并将这个工作例子发布到一个新问题上。使用你提供的代码,没有seg错误,但是'sample'行中有错误。 – Justin 2013-02-08 16:11:18