如何将宽时间序列数据帧转换为长数据帧?

时间:2017-03-16 16:43:32

标签: r

上下文,我希望将一个广泛的时间序列数据帧融合成一个长数据帧。这样我就可以在ggplot2中绘制数据并构建堆积区域图。时间序列不规律(缺少某些周末和假期)

当前数据框看起来像

df
    date        item_1    item_2     item_3 ...
1 1992-03-23      8.63     7.609     1.6546 ...
2 1992-03-24      7.98     7.634     1.6533 ... 
...

如何将上述数据框转换为

    date        variable    value
1 1992-03-23    item_1       8.63
2 1992-03-23    item_2      7.609
3 1992-03-23    item_3     1.6546
2 1992-03-24    item_1       7.98

使用以下代码我收到错误

> melted_df = melt(df)
Using as id variables
Error in as.Date.numer(value): 'origin' must be supplied

2 个答案:

答案 0 :(得分:1)

你必须在融合函数中指定id.vars作为第二个参数,它可以工作:

require(reshape)
df <- data.frame(date = as.Date(c("1992-03-23", "1992-03-24")),
                 item_1 = c(8.63, 7.98),
                 item_2 = c(7.609, 7.634),
                 item_3 = c(1.6546, 1.6533))

melt(df, "date")

你会得到:

        date variable  value
1 1992-03-23   item_1 8.6300
2 1992-03-24   item_1 7.9800
3 1992-03-23   item_2 7.6090
4 1992-03-24   item_2 7.6340
5 1992-03-23   item_3 1.6546
6 1992-03-24   item_3 1.6533

希望这会有所帮助

答案 1 :(得分:0)

gather

library(tidyverse)

df <- data.frame(date = as.Date(c("1992-03-23", "1992-03-24")),
                 item_1 = c(8.63, 7.98),
                 item_2 = c(7.609, 7.634),
                 item_3 = c(1.6546, 1.6533))

df %>% gather(variable, value, -date)

给出,

        date variable  value
1 1992-03-23   item_1 8.6300
2 1992-03-24   item_1 7.9800
3 1992-03-23   item_2 7.6090
4 1992-03-24   item_2 7.6340
5 1992-03-23   item_3 1.6546
6 1992-03-24   item_3 1.6533