2016-10-11 3 views
0

Я пытаюсь написать следующий цикл над эмпирическим набором данных, где каждый репликат ID имеет различное количество наблюдений за каждый период выборки. Любые предложения были бы высоко оценены!R сохранение результатов из вложенного цикла for

a <- unique(bma$ID) 
t <- unique(bma$Sample.period) 

# empty list to hold the data 

dens.data <- vector(mode='list', length = length(a) * length(t)) 
tank1 <- double(length(a)) 
index = 0 
for (i in 1:length(a)){ 
    for (j in 1:length(t)){ 
    index = index + 1 
    tank1[index] = a[index] ### building an ID column 
    temp.tank <- subset(bma, bma$ID == a[i]) 
    time.tank <- subset(temp.tank, temp.tank$Sample.period == t[j]) 
    temp1 <- unique(temp.tank$Sample.period) 
    temp.tank <- data.frame(temp.tank, temp1) 
    dens.1 <- density(time.tank$Biomass_.adults_mgC.mm.3, na.rm = T) 
    # extract the y-values from the pdf function - these need to be separated by each Replicate and Sample Period 
    dens.data[[index]] <- dens.1$y 
    } 
} 

#### extract the data and place into a dataframe 

dens.new<- data.frame(dens.data) 
dens.new 
colnames(dens.new) <- c("Treatment","Sample Period","pdf/density for biomass") 
all<- list(dens.new) 
all 

### create new spreadsheet with all the data from the loop 

dens.new.data<- write.csv(dens.new, "New.density.csv") ## export file to excel spreadsheet 

Вызов dens.new < - data.frame (dens.data) Выход следующее сообщение об ошибке:

Error in data.frame(c(...) : 
    arguments imply differing number of rows: 512, 0 

Петля, кажется, работает для dens.data[[1]] но возвращает NULL для dens.data[[>1]]

+0

Можете ли вы задать этот вопрос [минимальный и воспроизводимый] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) путем включения небольшого набора данных и ожидаемых результатов ? – shayaa

ответ

0

Поскольку нет минимального примера, мне трудно угадать, как выглядит исходный data.frame. Однако, как и для сообщения об ошибке, то ясно, что ваш для контура не может присваивать значение списка dens.data для индексов больше чем 1.

моего предположения, что index не обновлялась по index = index + 1. Возможно, вы могли бы попробовать изменить знак равенства = на стандартный оператор назначения R <- и посмотреть, обновлен ли весь список.

Я слышал, что использование знака равенства для присваивания может вызвать некоторые проблемы в старой версии R, но я не уверен, сталкиваетесь ли вы с той же проблемой. Во всяком случае, использование <- для назначения значения всегда безопаснее и рекомендуется.

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