Преобразование вектора в матрицу (в R)
Я хочу создать матрицу "n x 8" из вектора "n x 1"
- Вопрос: почему я хочу это сделать?
- Ответ: чтобы умножить матрицу на матрицу переходов вероятности цепи Маркова "8 x 8" и вернуть матрицу "n x 8" предсказанных состояний
- Решение: я решил эту проблему в Попытке 3 ниже - но хотите знать, есть ли лучший способ решить эту проблему (вместо использования двух функций транспонирования)?
Код R
Создайте фиктивный вектор "n x 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 FAIL: это не идеально, я хочу матрицу с ОДНОЙ записью на строку, а не ВОСЕМЬ.
Попытка 2: Сравните приведенное выше пространство состояний с матрицей, чтобы получить матрицу, состоящую из TRUE/FALSE:
> 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 FAIL: ожидается, что в каждой строке будет одна ИСТИНА, а остальные - ЛОЖЬ
Причина: (Я ДУМАЮ) матрицы сравниваются по столбцам.
Рассматривая Попытку 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 УСПЕХ: создала эту публикацию stackru, чтобы увидеть, есть ли лучший способ решить эту проблему (вместо использования двух функций транспонирования)
Другие варианты: dcast, изменить форму, распространение; к сожалению, тоже не сработало.
Я попытался изменить ():
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 ответ
Попробуй это:
> 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"