基于原始数据框列的名称进行融合和dcast

时间:2011-11-09 10:49:28

标签: r reshape

我很难重塑数据框以与错误条形图一起使用,将所有列与中心趋势数据相结合,并将所有列与错误数据分开。

我从一个带有自变量列的数据框开始,然后为每个测量参数选择两列:一列用于平均值,一列用于错误,因为您通常使用这种格式设置电子表格格式数据。初始数据框如下所示:

df<-data.frame(
  indep=1:3, 
  Amean=runif(3), 
  Aerr=rnorm(3), 
  Bmean=runif(3), 
  Berr=rnorm(3)
)

我想使用melt和dcast将它变成一个看起来像这样的形式:

df.cast<-data.frame(
  indep=rep(1:3, 2), 
  series=c(rep("A", 3), 
  rep("B", 3)), 
  means=runif(6), 
  errs=rnorm(6)
)

然后我就可以将它提供给ggplot,如下所示:

qplot(data=df.cast, x=indep, y=means, ymin=means-errs, ymax=means+errs, 
      col=series, geom="errorbar")

我一直试图融化,然后重新使用这样的表达式:

df.melt<-melt(df, id.vars="indep")
dcast(df.melt, 
  indep~(variable=="Amean"|variable=="Bmean") + (variable=="Aerr"|variable=="Berr")
)

但是这些返回一个带有趣的布尔列的数据框。

我可以手动制作两个数据帧(一个用于平均值,一个用于错误),将它们分开融化,然后重新组合,但肯定必须有更优雅的方式?

2 个答案:

答案 0 :(得分:3)

我就是这样做的:

# Melt the data

mdf <- melt(df, id.vars="indep")

# Separate the series from the statistic with regular expressions

mdf$series <- gsub("([A-Z]).*", "\\1", mdf$variable)
mdf$stat <- gsub("[A-Z](.*)", "\\1", mdf$variable)

# Cast the data (after dropping the original melt variable

cdf <- dcast(mdf[, -2], indep+series ~ stat)

# Plot

qplot(data=cdf, x=indep, y=mean, ymin=mean-err, ymax=mean+err, 
    colour=series, geom="errorbar")

enter image description here

答案 1 :(得分:2)

您可以使用基础R中的reshape来完成它

df.cast <- reshape(df, varying = 2:5, direction = 'long', timevar = 'series',
  v.names = c('mean', 'err'), times = c('A', 'B'))
qplot(data = df.cast, x = indep, y = mean, ymin = mean - err, ymax = mean + err, 
  colour = series, geom = "errorbar")