簡體   English   中英

將向量轉換為矩陣(R中)

[英]Converting a vector into a matrix (in R)

我想從“ nx 1”向量創建“ nx 8”矩陣

-問題:我為什么要這樣做?

-答案:為了將此矩陣與“ 8 x 8”馬爾可夫鏈概率轉換矩陣相乘,並返回預測狀態的“ nx 8”矩陣

- 解決方案:我已經在下面的嘗試3中解決了此問題-但想知道是否有更好的方法來解決此問題(而不是使用兩個轉置函數)?


R代碼

創建一個虛擬的“ 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失敗:這不是理想的選擇,我希望每行只有一個條目的矩陣,而不是8。


嘗試2:將上面的stateSpace與矩陣進行比較,得到由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失敗:期望每一行都具有一個TRUE,其余行為FALSE

原因:(我認為)矩陣是按列比較的。


進一步研究嘗試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成功:創建了這個stackoverflow帖子,以查看是否有更好的方法來解決此問題(而不是使用兩個轉置函數)


其他選項:鑄造,重塑,傳播; 可悲的是也沒有工作。

我試過了reshape():

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

我嘗試了spread():

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"

嘗試這個:

> 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中,矩陣基本上是底層的向量。 在上面創建mmatrix函數“回收”其參數spaces因為它需要創建一個包含16個元素的矩陣。 換句話說,以下兩個函數調用產生相同的結果:

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

類似地,當比較vm的相等性時, 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM