我有一个如下数据框(想象多个市场,1个市场:2个变量):
Market Variables median lower.limit upper.limit
market_1 var_1 2.78 2.71 2.72
market_1 var_2 3.21 2.96 3.44
market_2 var_1 2.95 2.79 3.11
market_2 var_2 2.11 1.91 2.30
我想用数据的胡须(var_1 vs var_2)进行散点图,但我无法理解如何重塑数据。我认为数据框架需要从长到宽,但我不知道如何处理转换中的下限/上限。我的专栏是:
Market var_1 var_1_lower.limit var_1_upper.limit var_2_median var_2_lower.limit var_2.upper.limit
或者有没有办法直接用ggplot对我的数据进行子集化?
答案 0 :(得分:2)
如果您想将数据重新塑造为wide
表单,可以使用reshape
中的base R
reshape(df, idvar="Market", timevar='Variables', direction='wide')
# Market median.var_1 lower.limit.var_1 upper.limit.var_1 median.var_2
#1 market_1 2.78 2.71 2.72 3.21
#3 market_2 2.95 2.79 3.11 2.11
# lower.limit.var_2 upper.limit.var_2
#1 2.96 3.44
#3 1.91 2.30
或使用dplyr/tidyr
library(dplyr)
library(tidyr)
df %>%
gather(Var, Val, median:upper.limit) %>%
unite(VarN,Variables, Var, sep="_") %>%
spread(VarN, Val)
# Market var_1_lower.limit var_1_median var_1_upper.limit var_2_lower.limit
#1 market_1 2.71 2.78 2.72 2.96
#2 market_2 2.79 2.95 3.11 1.91
# var_2_median var_2_upper.limit
#1 3.21 3.44
#2 2.11 2.30
或使用dcast/melt
reshape2
library(reshape2)
dcast(melt(df, id=c("Market", "Variables")), Market~..., value.var='value')
# Market var_1_median var_1_lower.limit var_1_upper.limit var_2_median
#1 market_1 2.78 2.71 2.72 3.21
#2 market_2 2.95 2.79 3.11 2.11
# var_2_lower.limit var_2_upper.limit
#1 2.96 3.44
#2 1.91 2.30
df <- structure(list(Market = c("market_1", "market_1", "market_2",
"market_2"), Variables = c("var_1", "var_2", "var_1", "var_2"
), median = c(2.78, 3.21, 2.95, 2.11), lower.limit = c(2.71,
2.96, 2.79, 1.91), upper.limit = c(2.72, 3.44, 3.11, 2.3)), .Names = c("Market",
"Variables", "median", "lower.limit", "upper.limit"), class = "data.frame", row.names = c(NA,
-4L))
答案 1 :(得分:1)
使用reshape2的另一种方法:
library(reshape2)
mm = melt(ddf, id=c('Market',"Variables"))
dcast(mm, Market~Variables+variable)
Market var_1_median var_1_lower.limit var_1_upper.limit var_2_median var_2_lower.limit var_2_upper.limit
1 market_1 2.78 2.71 2.72 3.21 2.96 3.44
2 market_2 2.95 2.79 3.11 2.11 1.91 2.30
但是您不需要重新塑造错误栏等等:
ggplot(ddf)+geom_errorbar(aes(x=Variables, y=median, ymin=lower.limit, ymax=upper.limit, color=Market))+geom_point(aes(x=Variables, y=median, color=Market))