R 如何在保留列名的同时,将矩阵的列智能地列到数据帧中?

R 如何在保留列名的同时,将矩阵的列智能地列到数据帧中?,r,dataframe,matrix,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 与lappy相同: lapply(da

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

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
lappy(1:ncol(M),函数(x)集合名(data.frame(M[,x]),colnames(M)[x]))
# [[1]]
#n1##一个选择可能是(综合我的原始帖子和@h1的建议):

其结构如下:

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

Map(stack,asplit(M,2))
你期望的是什么?@tmfmnk很有趣,但实际上不是,请参见编辑以获得澄清。很好的解决方案!不过还是有一些开销:
nchar(“split.default(data.frame(M),names(data.frame(M))))-nchar(“apply(M,2,data.frame)”))35;#27
@jay.sf一个很好的指标:D更新后的帖子是“just”18:)
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