为什么这个矩阵不是数字?然后`as.numeric`破坏矩阵并返回一个向量

时间:2016-08-19 14:03:50

标签: r matrix

我有一个名为input的数据框。第一列引用文章ID(ArtID),后续列将用于创建矩阵。

基于ArtID,我希望R生成一个2x2矩阵(更精确:它需要是一个数字2x2矩阵)。具体来说,我想为第一行(ArtID == 1),第二行(ArtID == 2)创建一个矩阵,依此类推......

到目前为止我想出的是:

for(i in 1:3) {stored.matrix = matrix(input[which(ArtID ==i),-1],nrow = 2)

这给了我一个2x2矩阵,但它不是数字(它需要)。

如果我应用as.numeric,矩阵不再是2x2矩阵。

如何获得2x2数值矩阵?

最小可重复的例子:

ArtID = c(1,2,3)
AC_AC = c(1,1,1)
MKT_AC = c(0.5,0.6,0.2)
AC_MKT = c(0.5,0.6,0.2)
MKT_MKT = c(1,1,1)
input = data.frame(ArtID, AC_AC, MKT_AC, AC_MKT, MKT_MKT)

stored.matrix = matrix(input[which(ArtID ==i),-1],nrow = 2)
#     [,1] [,2]
#[1,] 1    0.5 
#[2,] 0.5  1  

is.numeric(stored.matrix)
# [1] FALSE

as.numeric(stored.matrix)
## [1] 1.0 0.5 0.5 1.0

正如您在应用as.numeric()后所看到的那样,矩阵不再是2x2。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

您可以使用unlist()

matrix(unlist(input[ArtID ==i,-1]),2)

或使用

storage.mode(m) <- "numeric"

答案 1 :(得分:2)

如果数据框中只有数值,则使用矩阵更合适。将数据帧转换为矩阵将解决所有问题。另外,

input <- data.matrix(input)
ArtID = c(1,2,3)
AC_AC = c(1,1,1)
MKT_AC = c(0.5,0.6,0.2)
AC_MKT = c(0.5,0.6,0.2)
MKT_MKT = c(1,1,1)
input = data.frame(ArtID, AC_AC, MKT_AC, AC_MKT, MKT_MKT)

input <- data.matrix(input)   ## <- this line

stored.matrix = matrix(input[which(ArtID ==i),-1], 2)
is.numeric(stored.matrix)
# [1] TRUE

那是什么问题?

如果input是数据框,则行子集化的input[which(ArtID == i),-1]仍会返回数据框。数据框是一种特殊类型的列表。当您将列表提供给matrix()时,您会遇到矩阵列表的情况。

如果您阅读?matrix了解可以采取的数据,您会看到:

data: an optional data vector (including a list or ‘expression’
      vector).  Non-atomic classed R objects are coerced by
      ‘as.vector’ and all attributes discarded.

请注意,列表也是矢量数据类型(例如,is.vector(list(a = 1))提供TRUE),因此将列表提供给matrix是合法的。你可以尝试

test <- matrix(list(a = 1, b = 2, c = 3, d = 4), 2)
#     [,1] [,2]
#[1,] 1    3   
#[2,] 2    4   

这确实是class(test)给出&#34;矩阵&#34;)的意义上的矩阵,但是

str(test)
#List of 4
# $ : num 1
# $ : num 2
# $ : num 3
# $ : num 4
# - attr(*, "dim")= int [1:2] 2 2

typeof(test)
# [1] "list"

因此它不是我们所指的常用数值矩阵。

输入列表也可能很粗糙。

test <- matrix(list(a = 1, b = 2:3, c = 4:6, d = 7:10), 2)
#     [,1]      [,2]     
#[1,] 1         Integer,3
#[2,] Integer,2 Integer,4

str(test)
#List of 4
# $ : num 1
# $ : int [1:2] 2 3
# $ : int [1:3] 4 5 6
# $ : int [1:4] 7 8 9 10
# - attr(*, "dim")= int [1:2] 2 2
  

我想知道为什么typeof()给我列表......:)

是的,所以意识到了一些不同寻常的事情。矩阵的存储模式由其元素的存储模式决定。对于矩阵列表,元素是列表,因此矩阵具有&#34; list&#34;模式。