set.seed(123)
U = matrix(runif(20),5,4)
L = list(1,2,3,4)
# 1)
U %*% L
Error in U %*% L : requires numeric/complex matrix/vector arguments
# 2)
U %*% as.matrix(L)
Error in U %*% as.matrix(L) :
requires numeric/complex matrix/vector arguments
# 3)
U %*% unlist(L)
我想要2) & 3)给出相同的输出。我不明白为什么as.matrix()函数的行为和lists上的一样。matrix()已经将列表转换为列表矩阵。在我看来,as.matrix()应该将列表转换为列表元素的矩阵,因为“真正的”矩阵的主要属性之一是它的每个槽都是一个元素。那么,为什么不使用默认的强制来实现这一点呢?
我知道这些数据结构在R中是如何工作的,我并不困惑发生了什么,只是为什么它是默认行为。显然,我能够使用U %*% unlist(L)
或U %*% matrix(unlist(L),nrow = r, ncol = c)
获得所需的结果。但是,当由于各种原因,本应作为向量传递的内容却作为平面列表传递时,这有时会很不方便。这使得解开我的代码变得更加烦人。
我的问题是为什么as.matrix是这样定义的。这个问题特别令人头疼,因为据我所知,没有关于base R中的as.*()
函数的文档,也没有理由说明在类似的data.frame
数据结构上调用的as.matrix()
函数的行为差异。
我觉得这个定义很烦人的一个原因是:为什么as.list()支配as.matrix()。
# 4)
U %*% as.matrix(as.list(matrix(c(1,2,3,4))))
我只是觉得奇怪的是,一旦一些东西变成了列表,数据类型就被“锁定”了。我很少需要列表元素的矩阵,特别是从数字元素列表开始的时候。尽管如此,matrix()
已经为我做了这件事,那么为什么as.matrix()
被定义为做同样的事情呢?
让我仔细研究一下其中的差异:as.matrix
在data.frames上的工作方式和我预期的一样,为什么不能在列表上工作呢?
df = data.frame(a = 1, b= 2, c=3, d=4)
str(matrix(df))
List of 4...
str(as.matrix(df))
num [1, 1:4] 1 2 3 4 ...
# Note the difference between matrix() and as.matrix()!
lst = list(a = 1, b= 2, c= 3, d=4)
str(matrix(lst))
List of 4 ...
str(as.matrix(lst))
List of 4 ...
# Note the lack of difference between matrix() and as.matrix()!!!
据我所知,R中的as.*()
函数的要点是试图强制转换为所需的格式。在我看来,as.matrix()
并没有试图强制将列表转换为矩阵,而只是指定了一种“列表元素矩阵”的格式,我发现这种格式非常无用。我期望as.matrix()
的行为与matrix()
有所不同,并希望它返回扁平化列表的列矩阵,根据列表中的数据类型,该矩阵可以是字符,也可以是数字。我的意思是,这种行为也会与在数据帧上调用as.matrix()
更一致。
也许这与其说是一个问题,不如说是一个咆哮,但如果有人能向我解释为什么这是as.matrix()的行为,也许我会对as.matrix(as.list(matrix(c(1,2,3,4))))
不生成matrix(c(1,2,3,4))
这一事实感到高兴。
另外,有没有一个内置的强制方法,可以通过一个函数调用来实现这一点。也就是说,有没有一个内置函数,比如说coerceMatrix
,它至少可以在obj1和obj2上运行,也可能在obj3上运行:
obj1 = c(1,2,3,4)
obj2 = as.list(obj1)
obj3 = list(c(1,2),c(3,4))
identical(coerceMatrix(obj1), matrix(obj1))
[1] TRUE
identical(coerceMatrix(obj2), matrix(obj1))
[1] TRUE
identical(obj3), matrix(obj1))
[1] TRUE
如果不是,那么这个函数最简洁的版本是什么,以便我可以将它添加到我的个人库中?
发布于 2018-02-09 05:45:59
为什么它不能这样工作呢?%*%
需要对矩阵进行运算,或者是可以提升为矩阵的向量。看看这个(案例2):
str(matrix(list(1,2,3,4)))
List of 4
$ : num 1
$ : num 2
$ : num 3
$ : num 4
- attr(*, "dim")= int [1:2] 4 1
与此相比较(情况3)
str(unlist(list(1,2,3,4)))
num [1:4] 1 2 3 4
第二种情况只会生成一个列表,所以%*%
会抛出一个错误。第三种情况会产生一个向量,所以矩阵乘法工作正常。有关更多信息,我建议查看R的数据结构指南。数据科学的R有a good one。
https://stackoverflow.com/questions/48694478
复制相似问题