2013-09-09 2 views
1

Что было бы эквивалентно этому, используя функции семейства apply или комбинацию между do.call и apply? Я хотел бы сохранить его простым и, если это возможно в одной строке:эквивалентный способ использования семейства apply вместо цикла for для получения максимального значения каждой строки в списке подписок R

a <- list( as.data.frame(matrix(rnorm(12),4,3)), 
      as.data.frame(matrix(rnorm(12),4,3)), 
      as.data.frame(matrix(rnorm(12),4,3)) 
     ) 

l <- list() 
for (i in 1:length(a)) { 
    l[[i]] <- apply(a[[i]],1,max) 
} 

b <- do.call(data.frame, l) 
+0

@ SimonO101 Прошу прощения, если я разочарую кого-либо. Я, хотя, принимая ответ, предоставлял кредит автору. Я счастлив бросить больше, это то, как это работает. Простите за это. – nopeva

+0

@ SimonO101 благодарит за отзыв! – nopeva

+0

Добро пожаловать! –

ответ

2

Я хотел бы использовать sapply для этого конкретного примера, однако я не знаю, как представитель, этот пример вашей фактической большей проблемы.

> sapply(a, function(x) apply(x, 1, max)) 
      [,1]  [,2]  [,3] 
[1,] 0.5757814 0.9189774 0.6198257 
[2,] 0.1836433 0.9438362 0.4179416 
[3,] 1.5117812 1.1249309 1.3586796 
[4,] 1.5952808 0.5939013 -0.1027877 

sapply упростит матрицу, когда это возможно. Если вы хотите data.frame, просто оберните вывод в data.frame.

+0

вот это кажется проще ... большое спасибо! есть ли причина, почему вы предпочитаете 'sapply'' lapply'? – nopeva

+0

@eccehomo, 'lapply' создаст' list', 'sapply' будет упрощен до' матрицы', как я уже упоминал. Таким образом, для этой конкретной проблемы это выглядело более уместным. – A5C1D2H2I1M1N2O1R2T1

+1

vapply еще лучше, особенно если вы пишете функцию. – hadley