将矩阵或表重新整形为数据帧

时间:2018-05-24 21:21:56

标签: r

我遇到了从文件中读取数据的情况。每行文件都有一个时间戳,后跟三个测量结果。像这样:

> time <- c(0., 0.6, 1.1, 1.9)
> d1 <- c(6.4, 5, 2, 1.1)
> d2 <- c(8.1, 9.1, 9.9, 12)
> d3 <- c(-1.9, -1.2, -0.3, 0.2)
> 
> m <- cbind(time, d1, d2, d3)
> m
     time  d1   d2   d3
[1,]  0.0 6.4  8.1 -1.9
[2,]  0.6 5.0  9.1 -1.2
[3,]  1.1 2.0  9.9 -0.3
[4,]  1.9 1.1 12.0  0.2

我需要将表放入具有以下形式的数据框中:

  time   D  Temp
1  0.0  d1   6.4  
2  0.6  d1   5.0  
3  1.1  d1   2.0  
4  1.9  d1   1.1 
5  0.0  d2   8.1 
6  0.6  d2   9.1 
7  1.1  d2   9.9 
8  1.9  d2  12.0  
9  0.0  d3  -1.9
10 0.6  d3  -1.2
11 1.1  d3  -0.3
12 1.9  d3   0.2

我尝试使用melt,但它没有用。如何在更大的桌子上实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以使用tidyr::gather收集。

library(tidyr)
library(dplyr)
data.frame(m) %>% 
  gather(D, Temp, -time)

答案 1 :(得分:1)

我想,要使用reshape2::melt添加答案,因为OP提到了使用melt的愿望。 melt的优点是,不一定需要将matrix转换为data.frame

library(reshape2)

melt(as.data.frame(m), id.vars = "time", 
     measure.vars = c("d1", "d2", "d3"), variable.name = "D", value.name = "Temp")

#    time  D Temp
# 1   0.0 d1  6.4
# 2   0.6 d1  5.0
# 3   1.1 d1  2.0
# 4   1.9 d1  1.1
# 5   0.0 d2  8.1
# 6   0.6 d2  9.1
# 7   1.1 d2  9.9
# 8   1.9 d2 12.0
# 9   0.0 d3 -1.9
# 10  0.6 d3 -1.2
# 11  1.1 d3 -0.3
# 12  1.9 d3  0.2

此外,如果您不希望将matrix转换为data.frame,则melt可以用作:{/ p>

library(reshape2)
cbind(m[,1], melt(m[,-1])[,-1])

#    m[, 1] Var2 value
# 1     0.0   d1   6.4
# 2     0.6   d1   5.0
# 3     1.1   d1   2.0
# 4     1.9   d1   1.1
# 5     0.0   d2   8.1
# 6     0.6   d2   9.1
# 7     1.1   d2   9.9
# 8     1.9   d2  12.0
# 9     0.0   d3  -1.9
# 10    0.6   d3  -1.2
# 11    1.1   d3  -0.3
# 12    1.9   d3   0.2
相关问题