R 将4个色谱柱融化为3个,同时合并两个可变色谱柱
以下示例data.frame:R 将4个色谱柱融化为3个,同时合并两个可变色谱柱,r,dataframe,reshape,R,Dataframe,Reshape,以下示例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 <- 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
...
我设法把它完成了,但在我看来,我的方法是非常复杂的:
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
库(“重塑2”)
数据样本2%熔体(id=c(“日期”、“A”、“B”))
级别(数据样本变量)这是您想要的吗
data_sample_2 <- melt(data_sample,id.vars=c("Date","A_limit","B_limit"))
data_sample_2$limit<- ifelse(data_sample_2$variable=="A",data_sample_2$A_limit,data_sample_2$B_limit)
data_sample_2[,c("Date","limit","variable","value")]
data\u sample\u 2您可以通过base R通过stack
ing一切,即
df1 <- data.frame(Date = data_sample$Date, limit = stack(data_sample[-(1:3)])[[1]],
variable = stack(data_sample[2:3])[[2]],
value = stack(data_sample[2:3])[[1]],
stringsAsFactors = FALSE)
head(df1)
# Date limit variable value
#1 2016-09-01 200 A 67
#2 2016-09-02 200 A 100
#3 2016-09-03 200 A 166
#4 2016-09-04 200 A 116
#5 2016-09-05 200 A 89
#6 2016-09-06 200 A 138
tail(df1)
# Date limit variable value
#15 2016-09-05 400 B 208
#16 2016-09-06 400 B 387
#17 2016-09-07 400 B 125
#18 2016-09-08 400 B 116
#19 2016-09-09 400 B 120
#20 2016-09-10 400 B 241
df1由于您在示例中使用了restrape2
,您可能会感兴趣,想看看如何在(更更新的)tidyverse
设置中处理它
我将重复您的生成代码:
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)
# Preview
head(data_sample)
#> Date A B A_limit B_limit
#> 1 2016-09-01 39 53 200 400
#> 2 2016-09-02 96 193 200 400
#> 3 2016-09-03 143 75 200 400
#> 4 2016-09-04 60 241 200 400
#> 5 2016-09-05 126 225 200 400
#> 6 2016-09-06 184 349 200 400
您可以执行col1我在尝试代码时遇到此错误:错误:在数据中找不到测量变量:c(“A\u限制”、“B\u限制”)、c(“A”、“B”)
。有什么错误的线索吗?将数据\u样本
转换为数据表
first@mtoto很好的解决方案!这应该是一个答案。如何设置variable.name列,使其不只是1和2?我喜欢这种解决方案!有没有一种方法可以在堆叠时直接命名列?我在选择向量时错过了双精度[[…]]
。非常好的回答,非常感谢!
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)
# Preview
head(data_sample)
#> Date A B A_limit B_limit
#> 1 2016-09-01 39 53 200 400
#> 2 2016-09-02 96 193 200 400
#> 3 2016-09-03 143 75 200 400
#> 4 2016-09-04 60 241 200 400
#> 5 2016-09-05 126 225 200 400
#> 6 2016-09-06 184 349 200 400
library(dplyr)
library(tidyr)
data_clean <- data_sample %>%
gather(variable, value, A, B) %>%
mutate(limit = if_else(variable == "A", A_limit, B_limit)) %>%
select(Date, limit, variable, value)
# Inspect results
head(data_clean)
#> Date limit variable value
#> 1 2016-09-01 200 A 39
#> 2 2016-09-02 200 A 96
#> 3 2016-09-03 200 A 143
#> 4 2016-09-04 200 A 60
#> 5 2016-09-05 200 A 126
#> 6 2016-09-06 200 A 184