将 3x3 data.frame 转换为 1x9 data.frame,同时保留行名和列名
Turn 3x3 data.frame into 1x9 data.frame while preserving row and column names
对于这个看似简单的数据操作问题,我很难想出一个优雅的解决方案。我可以看到一个循环的解决方案,但我假设有一个 1-2 函数的单线解决方案。
这是我的资料:
x <- data.frame(c1=c(1,2,3),
c2=c(4,5,6),
c3=c(7,8,9),
row.names = c("r1","r2","r3"))
> x
c1 c2 c3
r1 1 4 7
r2 2 5 8
r3 3 6 9
这就是我想要的:
> y
c1.r1 c1.r2 c1.r3 c2.r1 c2.r2 c2.r3 c3.r1 c3.r2 c3.r3
1 1 2 3 4 5 6 7 8 9
如何操纵x
给我y
?
这是一种方法:
R> unlist(lapply(x, setNames, rownames(x)))
c1.r1 c1.r2 c1.r3 c2.r1 c2.r2 c2.r3 c3.r1 c3.r2 c3.r3
1 2 3 4 5 6 7 8 9
A data.frame
是一个列表,所以 lapply
只是循环列。然后它将每个向量的名称设置为 data.frame 的 rownames
。然后 unlist
将列表展平为向量(递归地,默认设置名称)。
对于这个看似简单的数据操作问题,我很难想出一个优雅的解决方案。我可以看到一个循环的解决方案,但我假设有一个 1-2 函数的单线解决方案。
这是我的资料:
x <- data.frame(c1=c(1,2,3),
c2=c(4,5,6),
c3=c(7,8,9),
row.names = c("r1","r2","r3"))
> x
c1 c2 c3
r1 1 4 7
r2 2 5 8
r3 3 6 9
这就是我想要的:
> y
c1.r1 c1.r2 c1.r3 c2.r1 c2.r2 c2.r3 c3.r1 c3.r2 c3.r3
1 1 2 3 4 5 6 7 8 9
如何操纵x
给我y
?
这是一种方法:
R> unlist(lapply(x, setNames, rownames(x)))
c1.r1 c1.r2 c1.r3 c2.r1 c2.r2 c2.r3 c3.r1 c3.r2 c3.r3
1 2 3 4 5 6 7 8 9
A data.frame
是一个列表,所以 lapply
只是循环列。然后它将每个向量的名称设置为 data.frame 的 rownames
。然后 unlist
将列表展平为向量(递归地,默认设置名称)。