Преобразование матрицы или таблицы в кадр данных - PullRequest
0 голосов
/ 25 мая 2018

У меня есть ситуация, когда я читаю данные из файла.Каждая строка файла имеет метку времени, за которой следуют три результата измерения.Примерно так:

> 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 голосов
/ 25 мая 2018

Я подумал, чтобы добавить ответ, используя 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 можно использовать как:

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
0 голосов
/ 25 мая 2018

Вы можете собрать с tidyr::gather.

library(tidyr)
library(dplyr)
data.frame(m) %>% 
  gather(D, Temp, -time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...