Составьте список матриц 2х2 из списка векторов

#r #matrix #lapply

Вопрос:

Я хочу составить список из четырех матриц 2х2 из этого списка

 str(SC_sum)  List of 4  $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.408 0.705 0.401 0.4  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.924 0.848 0.897 0.454  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  

с lapply(SC_sum, "matrix", nrow = 2, byrow = T)

Я ожидаю , что моя chisel матрица будет matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F) , которая является первым элементом в каждом из четырех векторов SC_sum , затем disc матрица будет комбинацией второго элемента в каждом векторе SC_sum и так далее.

Моя текущая chisel матрица — matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F) это перестановка первого вектора. Как мне изменить свой код? Большое спасибо!

Ответ №1:

Как насчет этого? Вот, x занимает место вашего SC_sum .

 x lt;- split(seq_len(16), gl(4, 4)) x lt;- lapply(x, `nameslt;-`, letters[1:4]) x  
 
 #r #matrix #lapply



Вопрос:

Я хочу составить список из четырех матриц 2х2 из этого списка
 str(SC_sum)  List of 4  $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.408 0.705 0.401 0.4  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.924 0.848 0.897 0.454  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  

с lapply(SC_sum, "matrix", nrow = 2, byrow = T)

Я ожидаю , что моя chisel матрица будет matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F) , которая является первым элементом в каждом из четырех векторов SC_sum , затем disc матрица будет комбинацией второго элемента в каждом векторе SC_sum и так далее.

Моя текущая chisel матрица - matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F) это перестановка первого вектора. Как мне изменить свой код? Большое спасибо!

Ответ №1:

Как насчет этого? Вот, x занимает место вашего SC_sum .

 x lt;- split(seq_len(16), gl(4, 4)) x lt;- lapply(x, `nameslt;-`, letters[1:4]) x  

1` a b c d 1 2 3 4

#r #matrix #lapply

Вопрос:

Я хочу составить список из четырех матриц 2х2 из этого списка

 str(SC_sum)  List of 4  $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.408 0.705 0.401 0.4  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.924 0.848 0.897 0.454  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  

с lapply(SC_sum, "matrix", nrow = 2, byrow = T)

Я ожидаю , что моя chisel матрица будет matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F) , которая является первым элементом в каждом из четырех векторов SC_sum , затем disc матрица будет комбинацией второго элемента в каждом векторе SC_sum и так далее.

Моя текущая chisel матрица - matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F) это перестановка первого вектора. Как мне изменить свой код? Большое спасибо!

Ответ №1:

Как насчет этого? Вот, x занимает место вашего SC_sum .

 x lt;- split(seq_len(16), gl(4, 4)) x lt;- lapply(x, `nameslt;-`, letters[1:4]) x  

2` a b c d 5 6 7 8

#r #matrix #lapply

Вопрос:

Я хочу составить список из четырех матриц 2х2 из этого списка

 str(SC_sum)  List of 4  $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.408 0.705 0.401 0.4  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.924 0.848 0.897 0.454  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  

с lapply(SC_sum, "matrix", nrow = 2, byrow = T)

Я ожидаю , что моя chisel матрица будет matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F) , которая является первым элементом в каждом из четырех векторов SC_sum , затем disc матрица будет комбинацией второго элемента в каждом векторе SC_sum и так далее.

Моя текущая chisel матрица - matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F) это перестановка первого вектора. Как мне изменить свой код? Большое спасибо!

Ответ №1:

Как насчет этого? Вот, x занимает место вашего SC_sum .

 x lt;- split(seq_len(16), gl(4, 4)) x lt;- lapply(x, `nameslt;-`, letters[1:4]) x  

3` a b c d 9 10 11 12

#r #matrix #lapply

Вопрос:

Я хочу составить список из четырех матриц 2х2 из этого списка

 str(SC_sum)  List of 4  $ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.408 0.705 0.401 0.4  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  $ : Named num [1:4] 0.924 0.848 0.897 0.454  ..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"  

с lapply(SC_sum, "matrix", nrow = 2, byrow = T)

Я ожидаю , что моя chisel матрица будет matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F) , которая является первым элементом в каждом из четырех векторов SC_sum , затем disc матрица будет комбинацией второго элемента в каждом векторе SC_sum и так далее.

Моя текущая chisel матрица - matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F) это перестановка первого вектора. Как мне изменить свой код? Большое спасибо!

Ответ №1:

Как насчет этого? Вот, x занимает место вашего SC_sum .

 x lt;- split(seq_len(16), gl(4, 4)) x lt;- lapply(x, `nameslt;-`, letters[1:4]) x  

4` a b c d 13 14 15 16

 m lt;- matrix(unlist(x), nrow = length(x[[1]]), ncol = length(x),   dimnames = list(names(x[[1]]), NULL)) m  
 [,1] [,2] [,3] [,4] a 1 5 9 13 b 2 6 10 14 c 3 7 11 15 d 4 8 12 16  
 l lt;- apply(m, 1, matrix, ncol = 2, simplify = FALSE) l  
 $a  [,1] [,2] [1,] 1 9 [2,] 5 13  $b  [,1] [,2] [1,] 2 10 [2,] 6 14  $c  [,1] [,2] [1,] 3 11 [2,] 7 15  $d  [,1] [,2] [1,] 4 12 [2,] 8 16  

Если вы действительно хотите использовать lapply и не apply хотите , то вы можете это сделать:

 index lt;- seq_along(x[[1]]) names(index) lt;- names(x[[1]]) l lt;- lapply(index, function(i) matrix(vapply(x, `[[`, 0, i), ncol = 2))  

Но поскольку ваши данные в основном прямоугольные, построение и работа с матрицей (я думаю) намного более интуитивны.

Комментарии:

1. Большое спасибо. vapply Совет хорошо работает для меня.