2017-02-20 11 views
0

Я не могу понять, что происходит с моим циклом, и это слишком сложно для моего текущего уровня. Я уже пробовал apply, но, очевидно, я делаю что-то не так, поэтому я не использовал его вообще.Ошибка синтаксиса нескольких циклов

library('wavelets') 
library('benford.analysis') 

indeces <- ls() # my initial datasets 
wfilters <- array(c("haar","la8","d4","c6")) # filter option in "modwt" function 
wfiltname <- array(c("h","l","d","c")) # to rename the new objects 

for (i in 1:nrow(as.array(indeces))) { 
    x <- get(as.matrix(indeces[i])) 
    x <- x[,2] 
    # Creates modwt objects equal to the number of filters 
    for (j in 1:nrow(as.array(wfilters))) { 
    x <- wavelets::modwt(x, filter = wfilters[j], n.levels = 4, 
         boundary = "periodic") 
    # A loop that creates a matrix with benford fun output per modwt n.levels option 
    for (l in 1:4) { 
     x <- as.matrix([email protected]$W[l]) # n.levels are represented as [email protected]$W1, [email protected]$W2,... 
     x <- benford.analysis::benford(x, number.of.digits = 1, 
            sign = "both", discrete = T, 
            round = 3) # accepts matrices 
     x[,l] <- x$bfd$data.dist # it always has 9 elements 
    } 
    assign(paste0("b", wfiltname[j], indeces[i]), x) 
    } 
} 

Вышеуказанный цикл должен быть воспроизводимым с любыми данными (где значения указаны во второй колонке). Ошибка, которую я получаю, следующая:

Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), : 
    'data' must be of a vector type, was 'NULL' 
+0

Я не был ко всем вашим кодом, но вы можете начать с изменения 'get (as.matrix (indeces [i]))' in 'as.matrix (get (indeces [i])) '. – Cath

+0

Рекомендация для отладки: поместите 'browse()' в место до возникновения ошибки. BTW: в конечном итоге 'for (i in 1: length (indeces))' эквивалентно 'for (i в 1: nrow (as.array (indeces))) – jogo

+0

Благодарим вас за комментарии. Я исправлю их, и я отредактирую свой пост. –

ответ

0

Благодаря @Cath и @jogo я сделал это после некоторых улучшений. Вот правильный код:

temp <- list.files(path = "...") 
list2env(
    lapply(setNames(temp, make.names(gsub("*.csv$", "", temp))), 
     read.csv), envir = .GlobalEnv) 
rm(temp) 

indeces <- ls() 
wfilters <- array(c("haar","la8","d4","c6")) 
wfiltname <- array(c("h","l","d","c")) 
k <- data.frame(matrix(nrow = 9,ncol = 4)) 
nlvl <- 4 

for (i in 1:length(indeces)) { 
    x <- as.matrix(get(indeces[i])) 
    for (j in 1:length(wfilters)) { 
    y <- wavelets::modwt(as.matrix(x), filter = wfilters[j], n.levels = nlvl, 
         boundary = "periodic") 
    y <- as.matrix([email protected]) 
    for(m in 1:nlvl) { 
     z <- as.matrix(y[[m]]) 
     z <- benford.analysis::benford(z, number.of.digits = 1, sign = "both", discrete = TRUE, round = 16) 
     k[m] <- as.data.frame(z$bfd$data.dist) 
     colnames(k)[m] <- paste0(wfilters[j], "W", m) 
    } 
    assign(paste0(indeces[i], wfiltname[j]), k) 
    } 
} 
rm(x,y,z,i,j,m,k) 

Я был бы признателен, если есть способ написать его более эффективно. Большое спасибо

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