从矩阵创建数据框

use*_*275 46 r matrix dataframe

如何获得与现有矩阵具有相同数据的数据框?

我的矩阵的简化示例:

mat <- matrix(c(0, 0.5, 1, 0.1, 0.2, 0.3, 0.3, 0.4, 0.5),
              ncol = 3, nrow = 3,
              dimnames = list(NULL, c("time", "C_0", "C_1")))

> mat
     time C_0 C_1
[1,]  0.0 0.1 0.3
[2,]  0.5 0.2 0.4
[3,]  1.0 0.3 0.5
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下所示的数据框:

     name   time   val
1    C_0    0.0    0.1
2    C_0    0.5    0.2
3    C_0    1.0    0.3
4    C_1    0.0    0.3
5    C_1    0.5    0.4
6    C_1    1.0    0.5
Run Code Online (Sandbox Code Playgroud)

我所有的尝试都非常笨拙,例如:

data.frame(cbind(c(rep("C_1", 3), rep("C_2", 3)),
                 rbind(cbind(mat[,"time"], mat[,"C_0"]),
                       cbind(mat[,"time"], mat[,"C_1"]))))
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何更优雅地做到这一点?请注意,我的实际数据还有一些列(40列).

Gre*_*now 45

如果将time列更改为行名,则可以使用这样as.data.frame(as.table(mat))的简单情况.

例:

> data <- c(0.1, 0.2, 0.3, 0.3, 0.4, 0.5)
> dimnames <- list(time=c(0, 0.5, 1), name=c("C_0", "C_1"))
> mat <- matrix(data, ncol=2, nrow=3, dimnames=dimnames)
> as.data.frame(as.table(mat))
  time name Freq
1    0  C_0  0.1
2  0.5  C_0  0.2
3    1  C_0  0.3
4    0  C_1  0.3
5  0.5  C_1  0.4
6    1  C_1  0.5
Run Code Online (Sandbox Code Playgroud)

在这种情况下,时间和名称都是因素.您可能希望将时间转换回数字,或者可能无关紧要.


ags*_*udy 11

您可以stack从基础包中使用.但是,首先需要将矩阵强制转换为a data.frame并在数据堆叠后重新排序列.

mat <- as.data.frame(mat)
res <- data.frame(time= mat$time,stack(mat,select=-time))
res[,c(3,1,2)]

  ind time values
1 C_0  0.0    0.1
2 C_0  0.5    0.2
3 C_0  1.0    0.3
4 C_1  0.0    0.3
5 C_1  0.5    0.4
6 C_1  1.0    0.5
Run Code Online (Sandbox Code Playgroud)

请注意,stack通常比reshape2包更有效.


Jos*_*ien 5

melt()从reshape2包让你接近......

library(reshape2)
(res <- melt(as.data.frame(mat), id="time"))
#   time variable value
# 1  0.0      C_0   0.1
# 2  0.5      C_0   0.2
# 3  1.0      C_0   0.3
# 4  0.0      C_1   0.3
# 5  0.5      C_1   0.4
# 6  1.0      C_1   0.5
Run Code Online (Sandbox Code Playgroud)

...虽然您可能希望对其结果进行后处理以获得您喜欢的列名和排序。

setNames(res[c("variable", "time", "value")], c("name", "time", "val"))
#   name time val
# 1  C_0  0.0 0.1
# 2  C_0  0.5 0.2
# 3  C_0  1.0 0.3
# 4  C_1  0.0 0.3
# 5  C_1  0.5 0.4
# 6  C_1  1.0 0.5
Run Code Online (Sandbox Code Playgroud)