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