Как использовать cbind для матриц в одном списке и поместить их в другой (r) - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь объединить матрицы, хранящиеся во вложенных списках, и поместить их в новый список. Например, если у меня есть список фруктов, я хотел бы взять различные матрицы, хранящиеся в Kiwi, и соединить их вместе как одну матрицу в новом списке.

Это сгенерирует что-то похожее на мои данные:

#Define some important things
Fruits = c('Mango', 'Kiwi')
Attr = c('Size', 'Shape')

#generate empty lists
MyFruitList <- lapply(Fruits, function(q) {
  EmptySublist <- (setNames(vector("list", length(Fruits)), Attr))
})
names(MyFruitList) <- Fruits

#Full lists with example matrices
MyFruitList[['Mango']][['Size']] <- matrix(c(3,5,7,2), nrow=2, ncol=2)
MyFruitList[['Mango']][['Shape']] <- matrix(c(3,6,7,5), nrow=2, ncol=2)

MyFruitList[['Kiwi']][['Size']] <- matrix(c(1,3,4,2), nrow=2, ncol=2)
MyFruitList[['Kiwi']][['Shape']] <- matrix(c(2,4,5,1), nrow=2, ncol=2)

И вот что я пытался использовать, чтобы переместить матрицы, хранящиеся под Киви и Манго, в новый список.

#Obviously this doesn't actually work
MyFruitListAsRows <- lapply(Fruits, function(i) {
  MyFruitListAsRows <- matrix(cbind(paste0(MyFruitList[i]))) 
})
names(MyFruitListAsRows) <- paste0(Fruits, "Row")

В идеале я должен получить список с именем MyFruitsAsRows, который содержит матрицы 2, 4 на 2 с именами Kiwi и Mango, содержащие соответствующие им данные Size и Shape из исходного списка MyFruitList ,

например. Для Манго это будет выглядеть так:

     [,1] [,2] [,3] [,4] 
[1,]    3    7   3    7
[2,]    5    2   6    5

(Извините, что цифры слишком схожи, это было плохо спланировано, и поначалу может быть трудно понять, куда бы я хотел, чтобы мои цифры шли)

Был построен из этого:

$Size
     [,1] [,2]
[1,]    3    7
[2,]    5    2

$Shape
     [,1] [,2]
[1,]    3    7
[2,]    6    5

Редактировать: я попытался адаптировать совет Ронака Шаха и сделал следующее:

library(tidyverse)

MyFruitListAsRows <- map(MyFruitList[i], bind_cols)

но работает либо

MyFruitListAsRows[['KiwiRow']]
MyFruitListAsRows[['MangoRow']]

Производит:

I get Error in x[i, , drop = FALSE] : subscript out of bounds

Если я пытаюсь заставить RStudio показать мне, что находится в одном из моих новых списков в окне, RStudio обнаруживает фатальную ошибку и вылетает.

1 Ответ

2 голосов
/ 21 апреля 2019

Мы можем использовать базу R для циклического перебора каждого MyFruitList и cbind их с do.call

lapply(MyFruitList, function(x) do.call(cbind, x))

#$Mango
#     [,1] [,2] [,3] [,4]
#[1,]    3    7    3    7
#[2,]    5    2    6    5

#$Kiwi
#     [,1] [,2] [,3] [,4]
#[1,]    1    4    2    5
#[2,]    3    2    4    1

Вы также можете использовать cbind.data.frame здесь.


Используя tidyverse, мы можем map для каждого списка, а затем cbind

library(tidyverse)
map(MyFruitList, cbind.data.frame)

#$Mango
#  Size.1 Size.2 Shape.1 Shape.2
#1      3      7       3       7
#2      5      2       6       5

#$Kiwi
#  Size.1 Size.2 Shape.1 Shape.2
#1      1      4       2       5
#2      3      2       4       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...