将data.frame的每一行重新整形为R中的矩阵

时间:2016-03-24 09:07:34

标签: r matrix

我正在使用手写的邮政编码数据集。我已经加载了这样的数据集:

digits <- read.table("./zip.train",
                     quote            = "",
                     comment.char     = "",
                     stringsAsFactors = F)

然后我只得到那些:

ones <- digits[digits$V1 == 1, -1]

现在,在ones我有442行,有256列。我需要将ones中的每一行转换为16x16 matrix。我认为我正在寻找的是16x16矩阵列表,就像这个问题中的那样:

How to create a list of matrix in R

但我尝试使用我的数据并且无法正常工作。

起初我尝试ones <- apply(ones, 1, matrix, nrow = 16, ncol = 16)但是没有像我想象的那样工作。我也试过lapply而没有运气。

2 个答案:

答案 0 :(得分:4)

另一种方法是只更改矩阵的dim

考虑以下矩阵“M”:

M <- matrix(1:12, ncol = 4)
M
#      [,1] [,2] [,3] [,4]
# [1,]    1    4    7   10
# [2,]    2    5    8   11
# [3,]    3    6    9   12

我们希望从中创建一个三维数组,因此您可以将尺寸指定为“row”,“column”,“third-dimensional”。但是,由于矩阵是按列构造的,因此首先需要t在更改尺寸之前对其进行遮挡。

`dim<-`(t(M), c(2, 2, nrow(M)))
# , , 1
# 
#      [,1] [,2]
# [1,]    1    7
# [2,]    4   10
# 
# , , 2
# 
#      [,1] [,2]
# [1,]    2    8
# [2,]    5   11
# 
# , , 3
# 
#      [,1] [,2]
# [1,]    3    9
# [2,]    6   12

答案 1 :(得分:2)

尽管可能有简单的方法,但您可以尝试使用lapply

ones_matrix <- lapply(1:nrow(ones), function(i){matrix(ones[i, ], nrow=16)})