0

我有每行一个观察的数据:

rm(list = ls(all = TRUE))
mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), var2 = sample(c("yes", "no"), 100, replace = TRUE), var3 = sample(c( "yes", "no"), 100, replace = TRUE), var4 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var5 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var6 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE))

我需要:制作一个带有并排条形对的堆叠条形图,每种类型一个条形(好与坏),显示每种类型中有多少有 0“是”变量,有多少有 1“ yes” var 等,对于所有 6 个 var,最多为“yes”。Y 轴 = 计数,X 轴 = 七个类别(0 是 vars,1 是 var 等)。每个条应该是一个堆叠条,颜色编码显示每个 var 对条的总高度的贡献。NA 被视为“否”。此外,重叠线显示了七个 X 轴类别中每个类别的计数(好)/计数(坏)的比率

4

1 回答 1

1

根据您的描述,这就是我理解您想要实现的目标。它由三个步骤组成:

  1. 将所有 NA 替换为“否”。
  2. 以逐行方式将所有“是”相加。
  3. 实际绘制图形。

所以解决每一点。

假设您的数据如下:

mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), 
                   var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), 
                   var2 = sample(c("yes", "no"), 100, replace = TRUE), 
                   var3 = sample(c( "yes", "no"), 100, replace = TRUE), 
                   var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))

1

用“no”替换所有 NA 只需:

mydf[is.na(mydf)] <- "no"

在这里,我们正在搜索 data.frame 并na使用赋值运算符将所有内容替换为 no。

2

为了逐行添加所有内容,我使用了该apply函数。在 apply 函数中,您可以使用?apply来确定参数,但简而言之,您(第一个参数)只需指定data.frame方向,(第二个参数)指定方向,1 表示按行,2 表示按列,(第 3 个参数) 指定您希望应用于方向的函数。

mydf$total.yes <- apply(mydf, 1, function(x) {
  return(length(x[x=="yes"]))
})

3

最后是剧情。制作情节最简单、最美观的方法是使用ggplot. 通过键入安装它install.packages("ggplot2")。对于条形图,我将参考此 [文档](此处:http ://docs.ggplot2.org/0.9.3.1/geom_bar.html ),否则代码将如下所示。

library(ggplot2)

ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar(position="dodge")

这将产生下面的情节:

在此处输入图像描述

我希望这能回答你所追求的问题。完整代码如下:

mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), 
                   var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), 
                   var2 = sample(c("yes", "no"), 100, replace = TRUE), 
                   var3 = sample(c( "yes", "no"), 100, replace = TRUE), 
                   var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))

library(ggplot2)

# replace all NA values to no, this step seems redundant because you're only 
# counting yes's
mydf[is.na(mydf)] <- "no"

# for each row figure out how many "yes" there are...
mydf$total.yes <- apply(mydf, 1, function(x) {
  return(length(x[x=="yes"]))
})

# see example here: http://docs.ggplot2.org/0.9.3.1/geom_bar.html
#using your data


ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar(position="dodge")

geom_bar默认情况下实际上是堆叠的(请参阅[文档](此处:http ://docs.ggplot2.org/0.9.3.1/geom_bar.html ),如果它被堆叠,它将看起来像以下内容:

ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar()

在此处输入图像描述

于 2015-05-17T04:34:52.433 回答