创建具有向量(非标量)元素的矩阵

SA1*_*A12 2 r vector matrix dataframe

我想创建一个像矩阵一样的对象,其元素为向量。喜欢:

(1,2,3) (1,3,6) (2,4,1)

(0,7,8) (2,3,4) (5,2,1)

(9,0,8) (8,4,6) (1,1,1)

我应该怎么办?

李哲源*_*李哲源 5

您可以使用矩阵列表。最初,您创建一个向量列表:

vec <- list(1:3, 4:10, 2:5, letters[1:3])
Run Code Online (Sandbox Code Playgroud)

然后将其强制转换为矩阵:

mat1 <- matrix(vec, nrow = 2, ncol = 2)
#     [,1]      [,2]       
#[1,] integer,3 integer,4  
#[2,] integer,7 character,3

mat2 <- matrix(vec, nrow = 2, ncol = 2, byrow = TRUE)
#     [,1]      [,2]       
#[1,] integer,3 integer,7  
#[2,] integer,4 character,3
Run Code Online (Sandbox Code Playgroud)

要提取其元素,请使用例如:

mat1[1, 1][[1]]
Run Code Online (Sandbox Code Playgroud)

首先[1, 1]是获取矩阵元素。但由于元素是一个列表,因此需要使用额外的元素[[1]]来访问实际的向量。


如果您想在打印时查看其内容,请将其强制为数据框。例如,

dat1 <- data.frame(mat1)
#                    X1         X2
#1              1, 2, 3 2, 3, 4, 5
#2 4, 5, 6, 7, 8, 9, 10    a, b, c
Run Code Online (Sandbox Code Playgroud)

您可以稍后更改列名称,例如,

names(dat1) <- c("col1", "col2")
#                  col1       col2
#1              1, 2, 3 2, 3, 4, 5
#2 4, 5, 6, 7, 8, 9, 10    a, b, c
Run Code Online (Sandbox Code Playgroud)

dat1$col1通过,dat1[[1]]或访问其列dat1[["col1"]]。在这种情况下,每一列都是一个列表。

如果您的最终目标是数据框而不是矩阵,则可以直接构造此数据框,但必须使用以下方法保护每一列I()

data.frame(col1 = I(list(1:3, 4:10)),
           col2 = I(list(2:5, letters[1:3])) )
#          col1       col2
#1      1, 2, 3 2, 3, 4, 5
#2 4, 5, 6,....    a, b, c
Run Code Online (Sandbox Code Playgroud)

无论如何,我不喜欢这些数据结构。它可能会使进一步的操作变得麻烦。