使用data.table时R的奇怪错误

时间:2013-02-08 14:30:01

标签: r data.table

我正在做一些小的计算,我决定在data.table内填充数据,因为它比data.framerbind

快得多

基本上我的代码是这样的:

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")

任何想法都表示赞赏。

1 个答案:

答案 0 :(得分: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的常量操作。{/ p>

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

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)

现在,看起来你要在第dt行分配到df(这是一个与dti非常相似的函数,应该避免作为变量名)这个合适的错误以及你的指标?据我所知,没有任何内容取决于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)