使用数据框的列制作面板

Make a panel using columns of a dataframe

我在 R 中有一个数据框,其中第一列代表客户 ID,其他列是每日日期。例如

id <- seq(1:4)
qqqq141101 <- c(500, 0, 78, 10)
qqqq141102 <- c(500, 0, 78, 10)
frame <- data.frame(id, qqqq141101 , qqqq141102)
frame

我想制作一个面板,其中每个客户都有两个具有相应值的日期。像这样

id <- c(1,1,2,2,3,3,4,4)
day <- as.Date(c('2014-11-01', '2014-11-02', '2014-11-01', '2014-11-02','2014-11-01', '2014-11-02','2014-11-01', '2014-11-02'))
value <- c(500,500, 0, 0, 78, 78, 10, 10)
frame <- data.frame(id, day , value)
frame

我的实际数据包括 400 多个客户和 100 多个天的变量。 如果有任何帮助,我将不胜感激。

类似这样的东西(需要 R 库 reshape2lubridate)。

# Your sample data
id <- seq(1:4)
qqqq141101 <- c(500, 0, 78, 10)
qqqq141102 <- c(500, 0, 78, 10)
frame <- data.frame(id, qqqq141101 , qqqq141102)

# Wide to long dataframe
require(reshape2);
df <- melt(frame, id.vars = "id");

# Get dates from column names
require(lubridate);
df$variable <- ymd(gsub("qqqq", "", df$variable));

# Order by id then date
df <- df[order(df$id, df$variable), ];
df;
#  id   variable value
#1  1 2014-11-01   500
#5  1 2014-11-02   500
#2  2 2014-11-01     0
#6  2 2014-11-02     0
#3  3 2014-11-01    78
#7  3 2014-11-02    78
#4  4 2014-11-01    10
#8  4 2014-11-02    10

您也可以通过以下方式解决此问题:

library(dplyr)
library(tidyr)
library(anytime)

frame %>% 
  gather(day, value, -1) %>%
  mutate(day = anydate(gsub('qqqq','20',day))) %>% 
  arrange(id)

结果:

  id        day value
1  1 2014-11-01   500
2  1 2014-11-02   500
3  2 2014-11-01     0
4  2 2014-11-02     0
5  3 2014-11-01    78
6  3 2014-11-02    78
7  4 2014-11-01    10
8  4 2014-11-02    10