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)
好的,这是我到目前为止从回复中收集的内容:
题
我怎样才能有不同类型的矩阵?
回答
你不能; 元素不是不同的类型; 该矩阵的所有(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,
List of 4int [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)
简答: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)