R 矩阵可以包含不同的数据类型吗?这个被修改的列表矩阵有用吗?

2024-04-13

我读了这些:

  • https://stackoverflow.com/a/5159049/1175496 https://stackoverflow.com/a/5159049/1175496

    Matrices are for data of the same type.

  • https://stackoverflow.com/q/29732279/1175496 https://stackoverflow.com/q/29732279/1175496

    Vectors (and so matrix) can accept only one type of data

如果矩阵只能接受一种数据类型,为什么我可以这样做:

> m_list<-matrix(list('1',2,3,4),2,2)
> m_list
     [,1] [,2]
[1,] "1"  3   
[2,] 2    4   

控制台输出看起来像是我正在组合字符和整数数据类型。 控制台输出看起来类似于此矩阵:

> m_vector<-matrix(1:4,2,2)
> m_vector
     [,1] [,2]
[1,]   1    3   
[2,]   2    4   

当我分配给 m_list 时,它不会强制其他值(如https://stackoverflow.com/q/29732279/1175496 https://stackoverflow.com/q/29732279/1175496 )

> m_list[2,2] <-'4'
> m_list
     [,1] [,2]
[1,] "1"  3 
[2,] 2    "4"  

好的,这是我迄今为止从回复中收集到的信息:

Question

如何拥有不同类型的矩阵?

Answer

你不能;元素不是不同的类型;该矩阵的所有 (4) 个元素都是列表

all(
is.list(m_list[1,1]), 
is.list(m_list[2,1]), 
is.list(m_list[1,2]), 
is.list(m_list[2,2]))
#[1] TRUE

Question

但我构建了这样的矩阵:matrix(list('1',2,3,4),2,2),这怎么变成了 (4) 的矩阵lists,而不是 (4) 的矩阵人物,甚至 (4)integers?

Answer

我不知道。尽管文档说 re:矩阵的第一个参数:

非原子类 R 对象由 as.vector 和所有强制 属性被丢弃。

看来这些是相同的

identical(as.vector(list('1',2,3,4)), list('1',2,3,4))
#[1] TRUE

Question

但我分配了一个字符('4') 到一个元素m_list, 这是如何运作的?

m_list[2,2] <-'4'

Answer

它是“强制的”,就好像你这样做了:

m_list[2,2] <- as.list('4')

Question

如果元素在m_list是列表,m_list 等价于matrix(c(list('1'),list(2),list(3),list(4)),2,2)?

Answer

是的,这些是等效的:

m_list  <- matrix(list('1',2,3,4),2,2)
m_list2 <- matrix(c(list('1'),list(2),list(3),list(4)),2,2)
identical(m_list, m_list2)
#[1] TRUE

Question

那么我怎样才能检索typeof the '1'隐藏在m_list[1,1]?

Answer

至少有两种方式:

typeof(m_list[1,1][[1]])
#[1] "character"

...或者,可以直接这样做(谢谢,弗兰克)(因为索引有这个“依次应用于列表、选定的组件、该组件的选定组件等” https://stackoverflow.com/a/1169495/1175496行为)...

typeof(m_list[[1,1]])
#[1] "character"

Question

我怎样才能区分这两者之间的区别

m1 <- matrix(c(list(1), list(2), list(3), list(4)), 2, 2)
m2 <- matrix(1:4, 2, 2)

Answer

如果您使用的是 RStudio,

  • m1 被描述为List of 4
  • m2 被描述为int [1:2, 1:2] 1 2 3 4

..或者,只需使用 typeof(),它对于向量和矩阵,标识其元素的类型...(谢谢,马丁)

typeof(m1)
#[1] "list"
typeof(m2)
#[1] "integer"

class也可以帮助区分,但必须先将矩阵包装在向量中:

#Without c(...)
class(m1)
#[1] "matrix"
class(m2)
#[1] "matrix"
#With c(...)
class(c(m1))
#[1] "list"
class(c(m2))
#[1] "integer"

...你可以看出控制台输出的细微差别;注意 m2 (包含整数)如何右对齐其元素(因为数字通常是右对齐的)...

m1
#     [,1] [,2]
#[1,] 1    3   
#[2,] 2    4   
m2
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 矩阵可以包含不同的数据类型吗?这个被修改的列表矩阵有用吗? 的相关文章

随机推荐