Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从矩阵创建数据帧_R_Matrix_Dataframe - Fatal编程技术网

R 从矩阵创建数据帧

R 从矩阵创建数据帧,r,matrix,dataframe,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

如何获得与已有矩阵具有相同数据的数据帧

我的矩阵的一个简化示例:

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
我所有的尝试都相当笨拙,例如:

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"]))))
有人知道如何做得更优雅吗?请注意,我的真实数据还有几列40列。

重塑2包的熔化让你接近

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
您可以使用基本包中的堆栈。但是,首先需要将矩阵强制为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
请注意,堆栈通常比重塑2包更有效。

如果将时间列更改为行名称,则可以将as.data.frameas.tablemat用于类似这样的简单情况

例如:

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

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

我发现下面的作弊方法非常灵活,而且没有错误

> dimnames <- list(time=c(0, 0.5, 1), name=c("C_0", "C_1"))
> mat <- matrix(data, ncol=2, nrow=3, dimnames=dimnames)
> head(mat, 2) #this returns the number of rows indicated in a data frame format
> df <- data.frame(head(mat, 2)) #"data.frame" might not be necessary

使用dplyr和tidyr:


你在找什么?熔化。还可以在SO搜索框中搜索[r]重塑2此处的更多信息:。谢谢!我在上面的评论之后尝试了meltmat,id=time,但无法确定我需要as.data.framematI我更喜欢堆栈解决方案,也因为我不需要从技术上加载Reforme2,堆栈在utils包中,默认情况下在交互式R会话中加载。有没有关于如何在矩阵的一个三角形上执行此操作的提示?我有一个镜像矩阵,所以我最终得到了重复的值。用upper.tri去掉名字。嗯-我不太清楚。最好将其作为单独的问题与一些示例数据分开。
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
> dimnames <- list(time=c(0, 0.5, 1), name=c("C_0", "C_1"))
> mat <- matrix(data, ncol=2, nrow=3, dimnames=dimnames)
> head(mat, 2) #this returns the number of rows indicated in a data frame format
> df <- data.frame(head(mat, 2)) #"data.frame" might not be necessary
library(dplyr)
library(tidyr)

df <- as_data_frame(mat) %>%      # convert the matrix to a data frame
  gather(name, val, C_0:C_1) %>%  # convert the data frame from wide to long
  select(name, time, val)         # reorder the columns

df
# A tibble: 6 x 3
   name  time   val
  <chr> <dbl> <dbl>
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