2015-04-25 4 views
0

У меня есть простой вопрос. Предполагая, что у меня есть список Obj длиной 500Как получить элемент с таким же именем в списке, чтобы избежать цикла в R

Obj[[1]], Obj[[2]], ....Obj[[500]], #for each Obj[[i]], it has an element 
Obj[[i]]$logL, 

Мой вопрос, как извлечь logL каждого Obj, чтобы избежать для цикла, как это?

logL = rep(NA, length(Obj)) 
for(i in 1: length(Obj)){ 
    logL[i] = Obj[[i]]$logL 
} 

Есть ли способ сделать это с помощью sapply или некоторых продвинутых пакетов, таких как plyr? Я открыт для решений, если это быстрее, чем цикл for, поскольку мне нужно сделать это в MCMC, а длина списка может быть 3000, поэтому я предпочитаю быстрый метод.

Заранее благодарен!

+0

Вам всего лишь нужно сделать его векторным? Если да, попробуйте unlist – Avinash

ответ

2

Вы можете использовать для этого группу функций. Вот учебник http://www.r-bloggers.com/using-apply-sapply-lapply-in-r/

sapply(obj, function(x) x$logL) 
+0

Спасибо, но я пробовал это, но получил следующую ошибку: «Ошибка в x $ logL: оператор $ недействителен для атомных векторов» – Crystal

+0

try 'sapply (obj, function (x) x [" logL "]) 'Если ваш цикл for работает, приведенный выше код должен работать. Может ли вы вывести сообщение 'class (obj [[1]])? – Koundy

+0

Спасибо Koundy, да, они оба работают! В предыдущем случае я создаю Obj $ logL, он не работает, позже я создаю Obj [[1]] $ logL, Obj [[2]] $ logL, оба метода, которые вы рекомендуете, оба работают! Большое спасибо, это очень полезно! – Crystal

5

Если вы просто хотите, чтобы сделать его в вектор, это должен сделать это. Не нужно применять.

unlist(Obj) 
+0

Я вижу, это простой и эффективный метод! Огромное спасибо!:) – Crystal