Извлечение информации из многоуровневых списков - R

У меня есть вывод из модели, записанной в многоуровневый список. По сути, имеется 5 переменных, и список составлен таким образом, что результаты для каждого сценария идентифицируются значениями переменных в этом сценарии. Таким образом, результаты запуска с K = 0,5, C = 0,9, V = 0,5, R = 0,25 и RV = 0 могут быть доступны с помощью

results$`K=0.05`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0`
1] FALSE FALSE FALSE FALSE FALSE

Ниже приведен пример того, как может выглядеть полный вывод:

results
$`K=0.05`
$`K=0.05`$`C=0.9`
$`K=0.05`$`C=0.9`$`V=0.5`
$`K=0.05`$`C=0.9`$`V=0.5`$`R=0.25`
$`K=0.05`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE




$`K=0.05`$`C=0.91`
$`K=0.05`$`C=0.91`$`V=0.5`
$`K=0.05`$`C=0.91`$`V=0.5`$`R=0.25`
$`K=0.05`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE




$`K=0.05`$`C=0.92`
$`K=0.05`$`C=0.92`$`V=0.5`
$`K=0.05`$`C=0.92`$`V=0.5`$`R=0.25`
$`K=0.05`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.05`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE





$`K=0.1`
$`K=0.1`$`C=0.9`
$`K=0.1`$`C=0.9`$`V=0.5`
$`K=0.1`$`C=0.9`$`V=0.5`$`R=0.25`
$`K=0.1`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE




$`K=0.1`$`C=0.91`
$`K=0.1`$`C=0.91`$`V=0.5`
$`K=0.1`$`C=0.91`$`V=0.5`$`R=0.25`
$`K=0.1`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE




$`K=0.1`$`C=0.92`
$`K=0.1`$`C=0.92`$`V=0.5`
$`K=0.1`$`C=0.92`$`V=0.5`$`R=0.25`
$`K=0.1`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.1`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE





$`K=0.15`
$`K=0.15`$`C=0.9`
$`K=0.15`$`C=0.9`$`V=0.5`
$`K=0.15`$`C=0.9`$`V=0.5`$`R=0.25`
$`K=0.15`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.15`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE  TRUE FALSE FALSE FALSE

$`K=0.15`$`C=0.9`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE




$`K=0.15`$`C=0.91`
$`K=0.15`$`C=0.91`$`V=0.5`
$`K=0.15`$`C=0.91`$`V=0.5`$`R=0.25`
$`K=0.15`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.15`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.15`$`C=0.91`$`V=0.5`$`R=0.25`$`RV=0.1`
[1]  TRUE FALSE FALSE FALSE FALSE




$`K=0.15`$`C=0.92`
$`K=0.15`$`C=0.92`$`V=0.5`
$`K=0.15`$`C=0.92`$`V=0.5`$`R=0.25`
$`K=0.15`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0`
[1] FALSE FALSE  TRUE FALSE FALSE

$`K=0.15`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.05`
[1] FALSE FALSE FALSE FALSE FALSE

$`K=0.15`$`C=0.92`$`V=0.5`$`R=0.25`$`RV=0.1`
[1] FALSE FALSE FALSE FALSE FALSE

Для анализа я хотел бы иметь возможность извлекать результаты из всех сценариев с определенными значениями переменных. Например, я хотел бы извлечь результаты сценариев с C = 0,92 и RV = 0,1 (или любой их комбинацией).

Что-то типа:

results$*$'C=0.92'$*$*$'RV=0.1'

or

results[*]['C=0.92'][*][*]['RV=0.1']

Я читал аналогичный вопрос о подстановочных знаках, которые я не думаю, что R использует, что не совсем попал туда, куда мне нужно было идти. Какие-либо предложения?

Ваше здоровье!


person Dan    schedule 05.03.2015    source источник


Ответы (1)


Вы действительно должны хранить свои данные во фрейме данных или что-то в этом роде. Я понимаю, что рекурсивная структура удобна, когда вы запускаете тесты в циклах, но все же. К счастью, есть функция, которая может сделать перевод:

lst <- list(a=list(b=list(c0=list(d0=1:3, e0=4:6), c1=list(d1=7:9, e1=10:12))))
library(reshape2)
DF <- melt(lst)
subset(DF, grepl("1", L4))  # now we can use regular expressions against each list level

Производит:

   value L4 L3 L2 L1
7      7 d1 c1  b  a
8      8 d1 c1  b  a
9      9 d1 c1  b  a
10    10 e1 c1  b  a
11    11 e1 c1  b  a
12    12 e1 c1  b  a

Вы можете посмотреть на DF, чтобы увидеть, что я делаю с подмножеством.

person BrodieG    schedule 05.03.2015
comment
Это может помочь, однако у меня также есть аналогичный вывод, где вместо векторов логики (как указано выше) каждый элемент списка представляет собой матрицу. Я попробую и посмотрю, что будет делать Melt() в этом случае... но это может быть немного грязно. Тем не менее, для того, что я перечислил выше, ваше решение элегантно. +1 - person Dan; 05.03.2015
comment
Попробовав это с другим выходом, я думаю, что это правильный путь. Спасибо за вашу помощь! Сохранение вывода в списках во время цикла является самым простым, но преобразование в расплавленный фрейм данных значительно упрощает анализ. Спасибо! - person Dan; 05.03.2015