如何在保留列名的同时将矩阵的列巧妙地列出到数据帧中?

时间:2019-10-26 10:42:46

标签: r dataframe matrix

假设我们有一个矩阵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

这出乎意料地麻烦。我可能错过了一个更简单的 base 函数吗?

数据

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

1 个答案:

答案 0 :(得分:3)

一个选择可能是(我的原始帖子和@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