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