使用数据框的列制作面板
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 库 reshape2
和 lubridate
)。
# 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
我在 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 库 reshape2
和 lubridate
)。
# 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