如何在R中创建一个列表矩阵?

10
我想要的是一个矩阵,其中每个元素本身都是一个列表。 看下面的例子:
1       2       3
1  1,2,4  1,2      1
2  Null   3,4,5,6  1,3  

我看了这篇文章,并尝试了以下内容,但出现了错误:

 b <- array()
 b[j, i, ] <- A[i]

A是一个向量本身。

错误信息如下:

 Error in b[j, i, ] <- A[i] : incorrect number of subscripts
如何定义和访问矩阵的每个元素以及包含列表的每个元素? 更新1:
b<-matrix(list(),nrow = length(d), ncol =length(c))

Error in b[j, i] <- A[i] : replacement has length zero

我希望明确每个元素都是一个列表,并尝试使用长度从零到n不同的各种列表来填充它。

更新2:

 running what @BondedDust commented :
 b<-matrix(rep(list(),(c*d)),,nrow = length(d), ncol =length(c))
 Erorr in b[[j*nrow(b)+i]] <- A[i] : attempt to select less than one element

A :

A[1]<-c(3)     F[[1]]<-numeric(0)   E[[1]]<-numeric(0)
A[2]<-c(1)     F[2]<-c(1)           E[2]<-c(1)
A[3]<-c(1)     F[3]<-c(2)           E[[3]]<-numeric(0)
A[[4]]<-c(1,3) F[[4]]<-numeric(0)   E[[4]]<-numeric(0)
A[5]<-c(4)     F[5]<-c(4)           E[5]<-c(4)

第一行的值为A,第二行的值为F,第三行的值为E(每行有5列)。

这些数据不是以这种形式存储的,它们是另一个函数的输出(在A[i]的位置有一个函数)。这些数据只是可重复地显示了A的外观,并因此显示了矩阵中的位置,并在update2中返回errorA[4]是第4列第2行的元素。


@DavidArenburgйңҖиҰҒзҡ„дёҚжҳҜmatrix(list(c(1,2,3)))еҗ—пјҹ - Molx
1
在矩阵中拥有列表元素并非不可能。 - IRTFM
matrix 的文档并没有说明 data 参数只能接受原子向量作为参数。它只是说 as.vector 会删除属性(这将剥离日期、POSIXct 和因子参数的类)。如果它们只是列表(毕竟另一种形式的“R向量”),那么数据就不会受到影响。 - IRTFM
进入编辑模式。将对象设置为空数组不允许您具有动态数组维度。这可能是其他语言中数组的特性,但在R中不是。 - IRTFM
1
此外,正如我之前所解释的那样,R矩阵是按列主序索引的。我想如果绝对需要像你描述的那样,你总是可以使用t()函数。 - IRTFM
显示剩余2条评论
1个回答

19

尽管打印方法没有按照你想象的方式显示,但这会构建那个矩阵:

 matrix( list(c(1,2,4), c(NULL), c(1,2), c(3,4,5,6), c(1), c(1,3)), 2,3)
 #---------
     [,1]      [,2]      [,3]     
[1,] Numeric,3 Numeric,2 1        
[2,] NULL      Numeric,4 Numeric,2

检查第一个元素:

> Mlist <- matrix( list(c(1,2,4), c(NULL), c(1,2), c(3,4,5,6), c(1), c(1,3)), 2,3)
> Mlist[1,1]
[[1]]
[1] 1 2 4

> is.matrix(Mlist)
[1] TRUE
> class( Mlist[1,1] )
[1] "list"

演示如何从列表中创建“列表的矩阵”:

> will.become.a.matrix <- list(c(1,2,4), c(NULL), c(1,2), c(3,4,5,6), c(1), c(1,3))
> is.matrix(will.become.a.matrix)
[1] FALSE
> dim(will.become.a.matrix) <- c(2,3)
> is.matrix(will.become.a.matrix)
[1] TRUE
> dim(will.become.a.matrix)
[1] 2 3
> class(will.become.a.matrix[1,1])
[1] "list"

进一步要求演示:

 A<- list(); F=list() E=list()
 A[1]<-c(3) ;  F[[1]]<-numeric(0);  E[[1]]<-numeric(0)
 A[2]<-c(1) ;  F[2]<-c(1)   ;        E[2]<-c(1)
 A[3]<-c(1) ;  F[3]<-c(2)  ;         E[[3]]<-numeric(0)
 A[[4]]<-list(1,3) ;F[[4]]<-numeric(0) ; E[[4]]<-numeric(0)
 A[5]<-c(4) ; F[5]<-c(4)       ;    E[5]<-c(4)
 Mlist= c(A,F,E)
 M <- matrix(Mlist, length(A), 3)
#=====================================
> M
     [,1]   [,2]      [,3]     
[1,] 3      Numeric,0 Numeric,0
[2,] 1      1         1        
[3,] 1      2         Numeric,0
[4,] List,2 Numeric,0 Numeric,0
[5,] 4      4         4        

你在评论中问道:"......是否有一种方法可以定义列和行的数量,但不定义元素本身,因为它们是未知的?"

(最初在评论中)回答:

b<-matrix(rep(list(), 6),nrow = 2, ncol =3) 
#.... then replace the NULL items with values. 
# Need to use "[[": for assignment (which your 'Update 1' did not 
# ....and your Update2 only did for some but not all of the assignments.)

b[[1]] <- c(1,2,3,4) 

1
@jhin:我不明白在我向你展示第一个元素是列表后,你还能坚持那个错误的立场。 - IRTFM
1
创建一个包含所需元素数量的列表。确保元素按“列主序”排列,然后使用 dim<-() 分配 m x n 的维度。 - IRTFM
1
当函数参数返回一个列表时,从tapply得到矩阵或列表数组是很常见的情况。 - IRTFM
1
b <- matrix(rep(list(), 6), nrow = 2, ncol = 3) .... 然后用值替换NULL项。需要使用 "[[":b[[1]] <- c(1,2,3,4) - IRTFM
2
就像我之前说的那样,需要使用“[[”:b[[j*nrow(b)+i]] - IRTFM
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接