-1

我正在做一些小计算,我决定将数据填充到 a 中,因为它比anddata.table快得多data.framerbind

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

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

任何想法表示赞赏。

4

1 回答 1

4

无意听起来粗鲁,我认为您可能会从阅读一些 R 教程中受益,然后再继续。这个问题也很可能因为过于本地化而被关闭。此外,seg faults几乎总是某个地方的错误,但您可以通过了解每段代码的作用来避免这些令人头疼的问题。从星期五开始,让我们来看看其中的一些:

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

我会假设datadf从那里去的。我们在两个循环中,i并且j都从 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)

现在,看起来您要在行中分配此拟合错误的结果以及您的索引dt(这是一个很像df并且应该避免作为变量名称的函数) ?dti据我所知,没有什么取决于ior j。相反,您将执行随机排序的适合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)
于 2013-02-08T15:45:34.977 回答