使用ggplot2绘制R中变量与条件矩阵的平均值

时间:2014-06-13 13:42:41

标签: r plot ggplot2

我有一个带有列X的data.frame X和一个带有M个二进制值(0/1)的data.frame C。两个data.frames都有N行(示例)。 我想在C的M列中的每个m的每个情况0/1上取平均值X. 当我绘制这个时,我接受得到M * 2条形,其中x轴是C中每列的列名,而红色/蓝色是当catergory m(超出M)为0/1时。

可以使用ggplot2完成吗? 没有for循环的任何其他快速方法吗?

结果草图:

      *
*     *           *
*     *     *     *
m1=0, m1=1, m2=0, m2=1 ,....

谢谢, 哈南

下面的数据示例: aggregate(X, by = as.list(C), FUN=mean)将汇总为C的任意组合。这不是我想要的。我希望XC每列的每个值汇总X<-structure(list(V1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = "V1", class = "data.frame", row.names = c(NA, -100L)) C<-structure(list(V1 = c(1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L), V2 = c(1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L ), V3 = c(1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L)), .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -100L))

{{1}}

1 个答案:

答案 0 :(得分:1)

这是一种通过增量步骤转换数据的方法

dd <- do.call(rbind, 
  Map(function(a,b) cbind(C=a, b), names(C), 
    lapply(
      lapply(
        lapply(C, table, X[[1]], dnn=c("CV","X")), 
     as.data.frame), 
   subset, X==1)
))

所以我们在这里使用table()来获取每个C值的每个X值的计数。然后我们将其转换为data.frame并仅获取X=1的计数。最后,我们添加C列的正确名称,并将所有data.frames合并为一个大型data.frame。

然后我们可以用

来绘制
ggplot(dd, aes(x=C, y=Freq, fill=CV)) + 
  geom_bar(position="dodge", stat="identity")

因此沿着x轴列出C的列,并且C的值由条的颜色表示。每组中X = 1的计数是条的高度。

enter image description here