【发布时间】:2018-01-03 02:11:42
【问题描述】:
我正在尝试比较两个变量并根据它们的相关性创建一个分组条形图。流失列是“是”或“否”。合同栏可以是“每月”、“一年”或“两年”。我最终想要的是一个分组条形图,其中包含每种合同类型的 Yeses 和 Nos 总数。例如,逐月合约类型在流失列中有 2220 个否,1655 个是。
我必须将 Churn 与其他两列性质相似的列进行比较,所以起初我试图创建一个函数,循环遍历每列的级别,提取信息并将其转储到向量中,但随后开始读取在 R 的循环中添加向量不是 最佳实践。
所以我花了很长时间来解决这个问题:
contractLevels = levels(cd$Contract)
c1n = length(cd$Contract[which(cd$Churn == "No" & cd$Contract == contractLevels[1])])
c1y = length(cd$Contract[which(cd$Churn == "Yes" & cd$Contract == contractLevels[1])])
c2n = length(cd$Contract[which(cd$Churn == "No" & cd$Contract == contractLevels[2])])
c2y = length(cd$Contract[which(cd$Churn == "Yes" & cd$Contract == contractLevels[2])])
c3n = length(cd$Contract[which(cd$Churn == "No" & cd$Contract == contractLevels[3])])
c3y = length(cd$Contract[which(cd$Churn == "Yes" & cd$Contract == contractLevels[3])])
cv <- c(c1n, c1y, c2n, c2y, c3n, c3y)
cv
cn <- c(paste(contractLevels[1], "No"), paste(contractLevels[1], "Yes"), paste(contractLevels[2], "No"), paste(contractLevels[2], "Yes"), paste(contractLevels[3], "No"), paste(contractLevels[3], "Yes"))
我仍然想让它尽可能容易重用,所以我没有输入实际的新列名 (cn)。首先,必须有一种更简单的方法来完成上述操作,而我只是一个 R 菜鸟,无法弄清楚。其次,我不能让它成为包含这些数据的分组条形图。我试图遵循这一点:http://www.r-graph-gallery.com/48-grouped-barplot-with-ggplot2/ 但由于 cn 和 cv 向量没有 7032 个“行”(就像我的数据一样),它不起作用。
是否可以这样说:将 X 列的每个级别在 Y 列中说“是”的总次数与每个级别在 Y 列中说“否”的总次数一起绘制图表。我一直在玩 rpart、plot 和 ggplot 试图解决这个问题。
只是做plot(cd$Contract, cd$Churn) 给了我一个堆叠图,这有点像我想要的,除了有点难以阅读。执行barplot(cv, ylab="Churn", names.arg=cn, cex.names=0.5, las=2) 给了我未分组的条形图,也有点难以阅读。
【问题讨论】:
-
请使您的示例可重现,即提供一些示例数据。此外,如果您可以显示所需的输出,即使它只是一个手绘草图也会很有帮助。