首页 > 解决方案 > 如何在保留列名的同时将矩阵的列巧妙地列出到数据框中?

问题描述

假设我们有一个矩阵M

#    n1 n2 n3 n4
# m1  1  4  7 10
# m2  2  5  8 11
# m3  3  6  9 12

为了列出"data.frames"我们可以做的列:

apply(M, 2, data.frame)

但是,列出的数据框具有奇怪且相同的列名,例如:

# $n1
#    newX...i.
# m1         1
# m2         2
# m3         3

同样的事情lapply

lapply(data.frame(M), data.frame)
# $n1
#   X..i..
# 1      1
# 2      2
# 3      3

到目前为止,我发现获得预期输出的唯一方法是:

lapply(1:ncol(M), function(x) setNames(data.frame(M[,x]), colnames(M)[x]))
# [[1]]
#    n1  ## <-- expected col names!
# m1  1
# m2  2
# m3  3

结果出乎意料地麻烦。我可能错过了一个更简单的基本功能吗?

数据

M <- structure(1:12, .Dim = 3:4, .Dimnames = list(c("m1", "m2", "m3"
), c("n1", "n2", "n3", "n4")))

标签: rdataframematrix

解决方案


一种选择可能是(综合我的原始帖子和@H 1 的建议):

split.default(data.frame(M), colnames(M))

它具有以下结构:

List of 4
 $ n1:'data.frame': 3 obs. of  1 variable:
  ..$ n1: int [1:3] 1 2 3
 $ n2:'data.frame': 3 obs. of  1 variable:
  ..$ n2: int [1:3] 4 5 6
 $ n3:'data.frame': 3 obs. of  1 variable:
  ..$ n3: int [1:3] 7 8 9
 $ n4:'data.frame': 3 obs. of  1 variable:
  ..$ n4: int [1:3] 10 11 12

推荐阅读