【发布时间】:2016-10-06 10:12:42
【问题描述】:
以下示例data.frame:
Date <- seq(as.Date("2016/9/1"), as.Date("2016/9/10"), "days")
A <- sample(0:200, 10)
B <- sample(0:400, 10)
A_limit <- rep(200,10)
B_limit <- rep(400,10)
data_sample <- data.frame(Date,A,B,A_limit,B_limit)
> Date A B A_limit B_limit
1 2016-09-01 175 270 200 400
2 2016-09-02 160 50 200 400
3 2016-09-03 173 25 200 400
...
我想把它改造成如下形式:
> Date limit variable value
1 2016-09-01 200 A 175
2 2016-09-02 200 A 160
3 2016-09-03 200 A 173
...
31 2016-09-01 400 B 270
32 2016-09-02 400 B 50
33 2016-09-03 400 B 25
....
我设法完成了,但在我看来,我的方法远非复杂:
library("reshape2")
data_sample_2 <- data_sample %>% melt(id=c("Date","A","B"))
levels(data_sample_2$variable) <- c(levels(data_sample_2$variable),"A","B")
data_sample_2$variable[data_sample_2$variable == "A_limit"] <- as.factor("A")
data_sample_2$variable[data_sample_2$variable == "B_limit"] <- as.factor("B")
names(data_sample_2)[names(data_sample_2) == "value"] <- "limit"
names(data_sample_2)[names(data_sample_2) == "variable"] <- "variable_1"
data_sample_3 <- data_sample_2 %>% melt(id=c("Date","variable_1","limit"))
data_sample_3 <- droplevels(data_sample_3)
data_sample_4 <- data_sample_3[data_sample_3$variable_1 == data_sample_3$variable,]
data_sample_4$variable_1 <- NULL
我刚开始使用 reshape2 包,所以请告诉我可以改进此 data.frame 转换的任何方法(无论它看起来多么明显)。
【问题讨论】:
-
你可以做
col1<-c("A_limit","B_limit"); col2 <- c("A","B");data.table::melt(data_sample, measure = list(col1,col2), value.name = c("limit","value"))如果你不介意数字variablecol. -
我在尝试您的代码时收到此错误:
Error: measure variables not found in data: c("A_limit", "B_limit"), c("A", "B")。任何线索出了什么问题? -
首先将
data_sample转换为data.table -
@mtoto 不错的解决方案!应该是一个答案。如何设置 variable.name 列,使其不仅仅是 1 和 2?