Заполнение списка с помощью цикла или Lapply - PullRequest
0 голосов
/ 27 августа 2018

Это мой список:

mylist=dput(mylist)
list(list(
        c(30, 50, 35, 25, 45), 
        c(40, 35, 35, 50, 45), 
        c(40, 20, 40, 50, 25), 
    ),
    list(
        c(50, 50, 25, 40, 45, 40, 35, 40, 45, 20), 
        c(40, 35, 40, 40, 45, 30, 20, 50, 35, 25), 
        c(20, 30, 50, 35, 45, 40, 25, 50, 35, 50), 
    ),
    list(
        c(45, 50, 25, 25, 30, 25, 35, 35, 35, 30, 50, 50, 30, 30, 20), 
        c(40, 20, 35, 35, 50, 20, 25, 30, 35, 20, 40, 20, 45, 30, 20), 
        c(50, 20, 25, 35, 35, 30, 50, 25, 40, 35, 45, 45, 35, 45, 25), 
    ), 
    list(
        c(50, 50, 50, 40, 20, 25, 50, 40, 50, 50, 45, 40, 30, 50, 35, 45, 50, 30, 
35, 45), 
        c(45, 20, 25, 20, 25, 30, 20, 30, 45, 25, 50, 30, 30, 25, 50, 45, 20, 45, 45, 50), 
        c(20, 40, 50, 25, 40, 45, 25, 30, 20, 20, 35, 45, 20, 40, 50, 45, 40, 40, 45, 35), 
    ),
     list(
        c(35, 25, 45, 20, 25, 30, 30,  35, 30, 40, 30, 20, 20, 30, 45, 40, 35, 35, 35, 35, 25, 45, 35, 20, 50), 
        c(50, 35, 30, 30, 35, 45, 45, 50, 25, 25, 40, 25, 50, 45, 25, 30, 30, 25, 45, 45, 30, 20, 50, 30, 30), 
        c(35, 40, 50, 25, 40, 45, 30, 25, 50, 25, 35, 50, 50, 50, 25, 50, 20, 50, 40, 25, 25, 35, 20, 20, 50),
    )
)

)

mylist=dput(mylist)
list
    (
    list( c(30, 50, 35, 25, 45), 
          c(40, 35, 35, 50, 45), 
          c(40, 20, 40, 50, 25), 
    ),
    list(   
            c(50, 50, 25, 40, 45, 40, 35,  40, 45, 20), 
            c(40, 35, 40, 40, 45, 30, 20, 50, 35, 25), 
            c(20,  30, 50, 35, 45, 40, 25, 50, 35, 50),
    ), list(
            c(45, 50, 25, 25, 30, 25, 35, 35, 35, 30, 50, 50, 30, 30, 20), 
            c(40, 20, 35, 35, 50, 20, 25, 30, 35, 20, 40, 20, 45, 30, 20), 
            c(50, 20, 25, 35, 35, 30, 50, 25, 40, 35, 45, 45, 35, 45, 25), 
), 
       list(
            c(50, 50,50, 40, 20, 25, 50, 40, 50, 50, 45, 40, 30, 50, 35, 45, 50, 30, 35, 45), 
            c(45, 20, 25, 20, 25, 30, 20, 30, 45, 25, 50, 30, 30, 25, 50, 45, 20, 45, 45, 50), 
            c(20, 40, 50, 25, 40, 45, 25, 30, 20, 20, 35, 45, 20, 40, 50, 45, 40, 40, 45, 35), 
),
 list(
        c(35, 25, 45, 20, 25, 30, 30, 35, 30, 40, 30, 20, 20, 30, 45, 40, 35, 35, 35, 35, 25, 45, 35, 20, 50), 
        c(50, 35, 30, 30, 35, 45, 45, 50, 25, 25, 40, 25, 50, 45, 25, 30, 30, 25, 45, 45, 30, 20, 50, 30, 30), 
c(35, 40, 50, 25, 40, 45, 30, 25, 50, 25, 35, 50, 50, 50, 25, 50, 20, 50, 40, 25, 25, 35, 20, 20, 50),

 )))

У меня две проблемы:

Во-первых: я не могу запустить это для цикла Loop ниже:

resultlist<-vector(mode = "list", 5)

for (i in 1:6) {
  for(k in 1:5) {     

    resultlist[[k]][[i]]<-mean(mylist[[k]][[i]]) 
   }

}

Отправляет сообщение: Error in mylist[[k]][[i]] : subscript out of bounds

Вторая проблема на самом деле является предложением: мой исходный for намного больше (например, мой i идет до 4828), чтобы запустить for с этими 2 индексами (k и * 1020) *) есть другие функции, которые позволят моему коду быть более простым / эффективным, или в этой ситуации лучше всего придерживаться for loop?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

В вашем случае ваш mylist[[4]] имеет только 5 элементов, поэтому ошибка возникает из-за того, что вы вызываете шестой элемент, который не существует. Если все элементы списка имеют одинаковую длину, вы можете использовать expand.grid, чтобы найти всю комбинацию, и использовать sapply, чтобы выполнить цикл, который немного быстрее, чем for Попробуйте это:

list_len=length(mylist)
sub_list_len=6
combination<-expand.grid(1:sub_list_len,1:list_len)
temp_output<-apply(combination,1,function(x) mean(  mylist[[x[2]]][[x[1]]] ))
resultlist<-split(temp_output,rep(1:list_len,each=sub_list_len)) %>% lapply(.,function(x) split(x,1:length(x)))
resultlist
0 голосов
/ 27 августа 2018

Вы получаете эту ошибку, потому что четвертый элемент mylist имеет только 5 подсписков.

Вы также можете сделать:

resultlist <- lapply(mylist, function(x) lapply(x, function(y) rep(mean(y), length(y))))

чтобы получить то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...