2013-09-21 2 views
1

У меня есть простой вопрос. У меня есть список объектов. Каждый объект имеет несколько списков. До этого становится слишком сложной, позвольте мне проиллюстрировать:Объединение объектов по списку

х = список

х [[1]] = некоторый объект

х [[2]] = другой объект

...

х [[п]] = другой объект

И как я уже сказал, каждый объект содержит еще несколько списков. Но меня интересует конкретный список, назовем его «а».

х [[1]] [[а]] = ('А': 1, 'В': 2 'С': 3, ..., Z: 26)

Извините за синтаксис, похожий на python! Я действительно просто изучаю R. В любом случае, то, что я хочу сделать, это объединить списки, хранящиеся в этих объектах, а затем взять их медиану. Чтобы сделать это более ясным, я хочу сгруппировать все элементы «А», а затем взять их медиану:

x [[1]] [[a]] [['A']], x [[2 ]] [[a]] [['A']], x [[3]] [[a]] [[A]], ..., x [[n]] [[a]] [ [ 'A']]

Точно так же я хочу, чтобы все группы 'B', 'C', ..., элементы 'Z' и взять их медиану ...

х [[ 1]] [[a]] [['Z']], x [[2]] [[a]] [['Z']], x [[3]] [[a]] [['Z ']], ..., x [[n]] [[a]] [[' Z ']]

Итак, вопрос в том, что это лучший способ сделать это? Я потратил часы, пытаясь понять это! Было бы здорово, если бы кто-нибудь мог мне помочь.

И если вы хотите знать, что я на самом деле делаю, в основном у меня есть список (x) случайных объектов леса. Итак, x [[1]] является первым случайным лесом, x [[100]] является 100-м случайным лесом. Каждый случайный лес имеет список прогнозируемых значений, которые хранятся в, например, х [[1]] [[ 'предсказали']]. Каждый список прогнозов имеет метку, связанную с ее прогнозируемым значением. То, что я на самом деле пытаюсь сделать, - вычислить медианное предсказанное значение каждой метки во всех 100 случайных лесах. И я хочу сделать это эффективно. В Python это легко, но в R я не уверен. В любом случае спасибо за помощь!!! Я очень ценю это.

+1

Используйте что-то вроде 'lapply (yourList, "[",«предсказал ")' – Andrie

+0

@ab, потому что вы новичок в SO, вы можете прочитать [this] (http://stackoverflow.com/about) и [this] (http://meta.stackoverflow.com/help/ кто-ответы). Приветствия. – Henrik

+0

Спасибо Andrie! Сначала это не сработало, но в итоге я получил нечто похожее на работу: sapply (list, function (y) y [['expecteded]]). –

ответ

0

Вот один из способов сделать это. Это немного сложно, потому что вы не можете использовать rapply для подмножества по именам элементов списка (что расстраивает). Но вы можете unlist, а затем подмножества по именам и принять median таким образом ...

# Make some reproducible data 
set.seed(1) 
l <- list(a = sample(10,3) , b = sample(10,3) , c = sample(10,3)) 
ll <- list(l , l , l) 

# Unlist - we get a named vector but all a's have unique names - e.g. a1 , a2... an 
unl <- unlist(ll) 
# a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b2 b3 c1 c2 c3 
# 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9 3 4 5 10 2 8 10 6 9 

# Subset by those elements that contian 'a' in their name 
a.unl <- unl[ grepl("a",names(unl)) ] 
# a1 a2 a3 a1 a2 a3 a1 a2 a3 
# 3 4 5 3 4 5 3 4 5 

# Take median 
median(a.unl) 
# [1] 4 

Чтобы перебрать несколько имен попробовать это ...

sapply(c("a" , "b" , "c") , function(x) median(unl[ grepl(x,names(unl)) ])) 
# a b c 
# 4 8 9 
+0

@ab 'for' loop не очень изящный (IMHO). Это обычно медленно. Попробуйте отредактировать. –

+0

Спасибо! Это определенно работает. Другим решением является использование sapply (выше) –

0

вы могли бы сделать это с помощью простого цикла для всех A, B, C, ...

x <- c() 
for(i in 1:n) x <- c(x, x[[i]][[a]][['A']]) 
median(x) 
0

Пример данных для создания списка верхнего уровня x:

x <- replicate(3, list(a = as.list(setNames(sample(1:100, 26), LETTERS)), 
         b = runif(10)), 
       simplify = FALSE) 

Во-первых, извлечь a из каждого списка:

a.only <- lapply(ll, `[[`, "a") 

Затем, чтобы вычислить все A через Z медианы в один снимок, do:

do.call(mapply, c(a.only, FUN = function(...) median(unlist(list(...))))) 
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
# 55 59 41 21 93 72 65 74 51 42 87 25 60 40 13 77 35 31 92 51 57 37 87 67 29 46 

Если подсписки содержат больше элементов, чем вам нужно, скажем, вы хотите только вычислить медианы на A, C, Z, сделайте следующее:

a.slices <- lapply(a.only, `[`, c("A", "C", "Z")) 
do.call(mapply, c(a.slices, FUN = function(...) median(unlist(list(...))))) 
# A C Z 
# 55 41 46 
Смежные вопросы