首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我希望as.matrix()在应用于R中的列表时有有用的行为

我希望as.matrix()在应用于R中的列表时有有用的行为
EN

Stack Overflow用户
提问于 2018-02-09 04:43:57
回答 1查看 74关注 0票数 -1
代码语言:javascript
复制
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()。

代码语言:javascript
复制
# 4) 
U %*% as.matrix(as.list(matrix(c(1,2,3,4))))

我只是觉得奇怪的是,一旦一些东西变成了列表,数据类型就被“锁定”了。我很少需要列表元素的矩阵,特别是从数字元素列表开始的时候。尽管如此,matrix()已经为我做了这件事,那么为什么as.matrix()被定义为做同样的事情呢?

让我仔细研究一下其中的差异:as.matrix在data.frames上的工作方式和我预期的一样,为什么不能在列表上工作呢?

代码语言:javascript
复制
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上运行:

代码语言:javascript
复制
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

如果不是,那么这个函数最简洁的版本是什么,以便我可以将它添加到我的个人库中?

EN

回答 1

Stack Overflow用户

发布于 2018-02-09 05:45:59

为什么它不能这样工作呢?%*%需要对矩阵进行运算,或者是可以提升为矩阵的向量。看看这个(案例2):

代码语言:javascript
复制
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)

代码语言:javascript
复制
str(unlist(list(1,2,3,4)))
 num [1:4] 1 2 3 4

第二种情况只会生成一个列表,所以%*%会抛出一个错误。第三种情况会产生一个向量,所以矩阵乘法工作正常。有关更多信息,我建议查看R的数据结构指南。数据科学的R有a good one

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48694478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档