我遇到了从文件中读取数据的情况。每行文件都有一个时间戳,后跟三个测量结果。像这样:
> 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
,但它没有用。如何在更大的桌子上实现这一目标?
答案 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