Список поднаборов, содержащий несколько классов по одному индексу / вектору - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно создать подмножество списка, который содержит массив, а также фактор-переменную.По сути, если вы представляете, что каждый компонент массива относится к одному индивиду, который затем связывается с двухфакторной переменной (лечение).

list(array=array(rnorm(2,4,1),c(5,5,10)), treatment= rep(c(1,2),5))

Обычно при настройке нескольких компонентов массива из первого компонента списка я использовал бы что-то вроде

 list$array[,,c(2,4,6)] 

, это возвращало бы компоненты массива в местоположении 2,4 и 6. Однако для факторного компонента списка это не сработает, так как поднаборы разные, что вам нужно, это:

 list$treatment[c(2,4,6)]

Нужно поместить в список список, содержащий разные классы (массиви вектор) на одно и то же относительное число.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Способ, которым вы используете для подстановки нескольких матриц, на самом деле дает ошибку, поскольку вы даете дополнительное измерение, хотя вы уже указываете, в каком подсписке вы находитесь. Следовательно, для поднабора матриц для данных индексов вы можете использовать my_list[[1]][indices] или напрямуюmy_list$matrices[indices].То же самое относится к делу my_list[[2]][indices] или my_list$treatement[indices]

0 голосов
/ 05 декабря 2018

Вы рассматриваете свой список матриц как некий трехмерный объект, но это не так.
Ваш list$matrices сам по себе также является списком, что означает, что вы также можете индексировать его как список., не имеет значения, является ли это списком матриц, чисел, объектов заговора или чего-либо еще.

Данные, которые вы предоставили в качестве примера, могут быть просто проиндексированы на одном уровне, поэтому list$matrices[c(2,4,6)] отлично работает,И я не получаю ваш вопрос о сохранении индексов в числовом векторе, что вас останавливает в этом коде?

indices <- c(2,4,6)
mysubset <- list(list$matrices[indices], list$treatment[indices])

РЕДАКТИРОВАТЬ, добавляя новую информацию для отредактированного вопроса:

Я вижу, у вас сейчас есть трехмерный массив.Что довольно странно, поскольку нет четкого соглашения о том, что можно рассматривать как «компоненты».Я имею в виду, что из вашего вопроса я понимаю, что list$array[,,n] относится к n-му человеку, но с точки зрения чистого кода нет причины, по которой что-то вроде list$array[n,,] не могло бы относиться к этому.
Может бытьВы получили идею из других языков, но это не совсем R-иш, ваш предыдущий пример со списком матриц стал для меня более понятным.И я думаю, что наиболее логичным был бы файл data.frame с матрицей столбцов и обработкой (который концептуально близок к списку с вектором и списком матриц, но для других он более понятен)

Но в любом случае, каков ваш желаемый результат?
Если это просто подмножество: с этой структурой, поскольку нет никаких ограничений на то, что могло бы быть контентом, вам просто нужно сказать R именно то, что вы хотите.Не существует ни одного оператора, который бы одновременно занимал подмножество вектора и 3-й индекс массива.Вам нужно будет сказать R, что вы хотите, чтобы третий индекс использовал для поднабора, и что вы хотите использовать тот же индекс для поднабора вектора.Который в основном просто код, который у вас уже есть:

idx <- c(2,4,6)
output <- list(list$array[,,idx], list$treatment[idx])
...