2013-02-08 56 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