[英]Reshaping a matrix or table into a dataframe
我遇到從文件讀取數據的情況。 文件的每一行都有一個時間戳,后跟三個測量結果。 像這樣:
> 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
但是沒有用。 如何在較大的桌子上完成此操作?
您可以和tidyr::gather
。
library(tidyr)
library(dplyr)
data.frame(m) %>%
gather(D, Temp, -time)
我認為,由於OP提到了使用melt
願望,所以使用reshape2::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
作為:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.