2013-02-08 2 views
-1

Я делаю некоторые небольшие расчеты и я решил заполнить данные внутри data.table, так как это намного быстрее, чем data.frame и rbindстранно ошибка 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) 

EDIT

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 индекса два я где ошибка мною при написании вопроса, но в основном функция вычисления что-то внутри этого цикла (где это написано я вычислить что-то), то я перетасовываю его, применяю регрессию для перетасованных данных, затем я сохраняю данные. Таблица – ifreak

+2

Если вы хотите поставить [воспроизводимый код] (http://stackoverflow.com/questions/5963269/how-to-make-a- замечательный-воспроизводимый пример). Я думаю, вы можете получить ответ. Я уверен, что три цикла для петель - это не самая эффективная техника для того, что вы делаете. Как бы то ни было, я не могу полностью следить за тем, что происходит там, не зная, что такое 'df', и зная, по крайней мере, немного о том, что происходит в вашем внутреннем для цикла. – Justin

+0

@ Justin Я обновил свой вопрос с помощью фрейма данных df и кода внутри внутреннего цикла. – ifreak

ответ

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 и идти оттуда. Мы находимся внутри двух петель 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 результат этой подгонки ошибки, а также ваши indicies? Насколько я могу судить, ничего не зависит от i или 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) 
+0

спасибо за ваш ответ, но в первую очередь 1, о котором вы говорите, не '1 его l', во-вторых, это просто тестовый скрипт, фактическая идея, которую я хочу реализовать, сложнее, и вы не можете использовать векотеризованную вещь. Потому что она включает в себя другие функции, которые будут присваивать 'X to df' и относительно выборки, да, что вы упомянули, что я хочу сделать .. но моя проблема в том, что 60 * 60 * 100 не заполняются внутри 'data.table', вместо этого я получаю ошибку, которую я скопировал. – ifreak

+0

Предлагаю вам разбить вашу проблему на управляемые куски , особенно часть, которая вызывает вашу ошибку. Затем работайте с минимальным воспроизводимым примером, который все равно даст ошибку и опубликует этот рабочий пример на новый вопрос. Используя код, который вы указали, отсутствует seg-ошибка, а вместо этого ошибка в строке 'sample'. – Justin

Смежные вопросы