R矩阵可以包含不同的数据类型吗?这个黑客入侵列表是否有效?

The*_*Pea 5 types r list matrix

我看了这些:

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

> m_list<-matrix(list('1',2,3,4),2,2)
> m_list
     [,1] [,2]
[1,] "1"  3   
[2,] 2    4   
Run Code Online (Sandbox Code Playgroud)

控制台输出看起来像是在组合字符和整数数据类型.控制台输出看起来类似于这个矩阵:

> m_vector<-matrix(1:4,2,2)
> m_vector
     [,1] [,2]
[1,]   1    3   
[2,]   2    4   
Run Code Online (Sandbox Code Playgroud)

当我分配给m_list时,它不会强制其他值(如在具有不同数据类型的Matrix中)

> m_list[2,2] <-'4'
> m_list
     [,1] [,2]
[1,] "1"  3 
[2,] 2    "4"  
Run Code Online (Sandbox Code Playgroud)

The*_*Pea 7

好的,这是我到目前为止从回复中收集的内容:

我怎样才能有不同类型的矩阵?

回答

你不能; 元素不是不同的类型; 该矩阵的所有(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
Run Code Online (Sandbox Code Playgroud)

但是我构造了这样的矩阵:matrix(list('1',2,3,4),2,2)这是如何成为(4)列表的矩阵,而不是(4)字符的矩阵,甚至是(4)整数

回答

我不确定.即使文档说re:矩阵的第一个参数:

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

似乎这些是相同的

identical(as.vector(list('1',2,3,4)), list('1',2,3,4))
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

但我将一个字符('4')分配给一个元素m_list,它是如何工作的?

m_list[2,2] <-'4'
Run Code Online (Sandbox Code Playgroud)

回答

这是"胁迫",就像你这样做:

m_list[2,2] <- as.list('4')
Run Code Online (Sandbox Code Playgroud)

如果m_list列表中的元素是m_list相当于matrix(c(list('1'),list(2),list(3),list(4)),2,2)

回答

是的,这些是等价的:

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
Run Code Online (Sandbox Code Playgroud)

所以,我怎么能检索typeof'1'隐藏的m_list[1,1]

回答

至少有两种方式:

typeof(m_list[1,1][[1]])
#[1] "character"
Run Code Online (Sandbox Code Playgroud)

...或者,可以直接执行此操作(谢谢,Frank)(因为索引已将此"依次应用于列表,所选组件,该组件的选定组件等等"行为)...

typeof(m_list[[1,1]])
#[1] "character"
Run Code Online (Sandbox Code Playgroud)

我怎么能分辨出这两者之间的区别呢

m1 <- matrix(c(list(1), list(2), list(3), list(4)), 2, 2)
m2 <- matrix(1:4, 2, 2)
Run Code Online (Sandbox Code Playgroud)

回答

如果你使用的是RStudio,

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

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

typeof(m1)
#[1] "list"
typeof(m2)
#[1] "integer"
Run Code Online (Sandbox Code Playgroud)

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

#Without c(...)
class(m1)
#[1] "matrix"
class(m2)
#[1] "matrix"
#With c(...)
class(c(m1))
#[1] "list"
class(c(m2))
#[1] "integer"
Run Code Online (Sandbox Code Playgroud)

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

m1
#     [,1] [,2]
#[1,] 1    3   
#[2,] 2    4   
m2
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
Run Code Online (Sandbox Code Playgroud)


raf*_*aoc 1

简答:R 中的矩阵不能包含不同的数据类型。所有数据都必须或将被转换为逻辑、数字、字符或列表

矩阵始终包含相同的类型。如果matrix()的输入数据具有不同的数据类型,它们将自动转换为相同的类型。因此,所有数据都是逻辑数据、数字数据、字符数据或列表数据。这是您的情况,在您的示例中,所有元素都被转换为单独的列表。

> myList <- list('1',2,3,4)
> myMatrix <- matrix( myList ,2,2)
> myMatrix
     [,1] [,2]
[1,] "1"  3   
[2,] 2    4 
> typeof(myMatrix)
"list"
Run Code Online (Sandbox Code Playgroud)

如果您想完全转换列表中的数据,则需要取消列出数据。

> myList <- list('1',2,3,4)
> myMatrix <- matrix( unlist(myList) ,2,2)
> myMatrix
     [,1] [,2]
[1,] "1"  "3" 
[2,] "2"  "4" 
> typeof(myMatrix)
"character"
Run Code Online (Sandbox Code Playgroud)