Преобразование вектора в матрицу (в R) - PullRequest
0 голосов
/ 25 мая 2018

Я хочу создать матрицу "nx 8" из вектора "nx 1"

- Вопрос: Почему я хочу это сделать?

- Ответ: По порядкучтобы умножить это на матрицу переходов вероятности цепи Маркова "8 x 8" и вернуть матрицу "nx 8" предсказанных состояний

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


R code

Создатьфиктивный вектор "nx 1": (здесь мы используем n = 2)

> temp_vector <- c("state 4", "state 7")
> temp_vector
[1] "state 4" "state 7"

Ожидаемый результат:

NA NA NA TRUE NA NA NA NA
NA NA NA NA NA NA TRUE NA

Попытка 1: преобразовать в матрицу:

> temp_matrix <- matrix(temp_vector, 
                ncol = 8, # there are 8 states
                nrow = length(temp_vector) # there are 10 rows in the vector
                )
> temp_matrix
     [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]     
[1,] "state 4" "state 4" "state 4" "state 4" "state 4" "state 4" "state 4" "state 4"
[2,] "state 7" "state 7" "state 7" "state 7" "state 7" "state 7" "state 7" "state 7"

Попытка 1 СБОЙ: Это не идеально, я хочу матрицу с ОДНОЙ записью на строку, а не ВОСЕМЬ.


Попытка 2: Сравните приведенное выше пространство состояний с матрицей, чтобы получитьматрица, состоящая из ИСТИНА / ЛОЖЬ:

> stateSpace <- c("state 1", "state 2", "state 3", "state 4", "state 5", "state 6", "state 7", "state 8")

> temp_matrix == stateSpace
     state 1 state 2 state 3 state 4 state 5 state 6 state 7 state 8
[1,]   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE
[2,]   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE

Попытка 2 СБОЙ: ожидается, что в каждой строке будет одна ИСТИНА, а оставшаяся ЛОЖЬ

Причина: (Я ДУМАЮ) матрицаОни сравниваются по столбцам.


Дальнейшее изучение попытки 2, для элемента по уровню элемента это работает :

> temp_matrix[1,1] == colnames(temp_matrix)[1]
state 1 
  FALSE 
> temp_matrix[1,2] == colnames(temp_matrix)[2]
state 2 
  FALSE 
> temp_matrix[1,3] == colnames(temp_matrix)[3]
state 3 
  FALSE 
> temp_matrix[1,4] == colnames(temp_matrix)[4]
state 4 
   TRUE 

Просмотр попытки 2далее, на уровне строки за строкой это работает :

> temp_matrix[1,] == colnames(temp_matrix)[]
state 1 state 2 state 3 state 4 state 5 state 6 state 7 state 8 
  FALSE   FALSE   FALSE    TRUE   FALSE   FALSE   FALSE   FALSE 

> temp_matrix[2,] == colnames(temp_matrix)[]
state 1 state 2 state 3 state 4 state 5 state 6 state 7 state 8 
  FALSE   FALSE   FALSE   FALSE   FALSE   FALSE    TRUE   FALSE 

Попытка 3: после того, как вы отметили вышеизложенное изучение столбцового сравнения в R

> t(stateSpace == t(temp_matrix))
     state 1 state 2 state 3 state 4 state 5 state 6 state 7 state 8
[1,]    TRUE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE
[2,]   FALSE    TRUE   FALSE   FALSE   FALSE   FALSE   FALSE   FALSE

Попытка 3 УСПЕХ: создала эту публикацию стека переполнения, чтобы увидеть, есть ли лучший способ решить эту проблему (вместо использования двух функций транспонирования)


Другие опции: dcast, reshape, spread;к сожалению, это тоже НЕ сработало.

Я попытался изменить форму ():

reshape(temp_vector, direction = "wide")
> Error in data[, timevar] : incorrect number of dimensions

Я попытался распространить ():

library(tidyr)
spread(temp_vector, key = numbers, value = value)
> Error in UseMethod("spread_") : 
  no applicable method for 'spread_' applied to an object of class "factor"

1 Ответ

0 голосов
/ 04 июня 2018

Попробуйте это:

> v <- c("state 4", "state 7")
> states <- c("state 1", "state 2", "state 3", "state 4",
+             "state 5", "state 6", "state 7", "state 8")
> m <- matrix(states, byrow = TRUE, nrow = 2, ncol = 8)
> m
#      [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      # [,8]     
# [1,] "state 1" "state 2" "state 3" "state 4" "state 5" "state 6" "state 7" "state 8"
# [2,] "state 1" "state 2" "state 3" "state 4" "state 5" "state 6" "state 7" "state 8"
> v == m
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
# [1,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE

В R матрица - это в основном вектор под капотом.Когда m создан выше, функция matrix «перезаписывает» свой аргумент spaces, потому что ей нужно создать матрицу из 16 элементов.Другими словами, следующие два вызова функций дают один и тот же результат:

> matrix(states, byrow = TRUE, nrow = 2, ncol = 8)
> matrix(rep(states, 2), byrow = TRUE, nrow = 2, ncol = 8)

Аналогично, когда v и m сравниваются на равенство, v повторно используется 8 раз, чтобы получить вектордлина 16. Другими словами, следующие два сравнения на равенство дают одинаковые результаты:

> v == m
> rep(v, 8) == m

Вы можете думать о двух вышеупомянутых сравнениях как происходящих между двумя векторами, где матрица m преобразуется обратно ввектор, укладывая столбцы.Вы можете использовать as.vector, чтобы увидеть вектор, которому m соответствует:

> as.vector(m)
#  [1] "state 1" "state 1" "state 2" "state 2" "state 3" "state 3" "state 4" "state 4" "state 5"
# [10] "state 5" "state 6" "state 6" "state 7" "state 7" "state 8" "state 8"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...