boxplot单标量变量" by" r数据中的多个真/假变量

时间:2015-04-15 16:24:09

标签: r boxplot

我几个月来一直在徘徊数据。对不起,如果这看起来很基本。我一直在寻找各种紧密的问题和解决方案,但不知怎的,我似乎无法适应我的情况。开始怀疑这是否应该是我应该尝试做的事情,但我想要问它是不是很痛苦。

我有一个数据框,它有一个标量变量和多个T / F(是/否; 1 / 0,1 / 2)变量。像这样:

    scal var1 var2 var3
     25   0   1    0
     21   0   1    1
     14   1   1    0
     30   1   0    1

我知道我可以制作一个箱形图,它使用""将标量变量列分成几个类别。对于单个变量,如:

boxplot(df$scal~df$var1)

我也知道我可以一次制作多个标量变量的箱形图。我想以某种方式将两者结合起来制作一个箱形图,它可以绘制每个"真的"的因变量。子集和" false"每个变量的子集彼此相邻。在我的世界中,一个解决方案应该看起来像" boxplot(df $ scal~df $ var1,df $ scal~df $ var2,df $ scal~df $ var3)",但是r数据没有&# 39;不同意我的意见。关于无法强制数据类型的事情。

我还可以编写一个粗略循环来遍历每个变量并分别生成所有图,但我想并排比较它们。

我还想过重新安排数据集,以便" true"和"假"集合在不同的列中(使用子集(df $ var1,df $ var1 == 1)等),然后如前所述制作多个箱图。 (虽然这是相当的tedius)

var1t var1f var2t var2f var3t var3f
 14    25    25    30    21    25
 30    21    21          30    14
             14                  
boxplot(df2$var1t, df2$var1f, df2$var2t, df2$var2f, df2$var3t, df2$var3f)

然而,在创建新数据集时,列的不同长度(行数)使我适合。我知道我可以在另一个程序中创建一个数据集(保存为.csv,.xls等)然后导入它。空值将保持不变,但我真的不想手动执行此操作。正如人们可能想象的那样,这变得相当繁琐,并且在更大的范围内容易出错。

非常欢迎任何一种方法的帮助。

2 个答案:

答案 0 :(得分:1)

当你开始学习如何操纵R中的数据可能很难。我同意@jentjr认为学习ggplot2会有所帮助,而且除了涵盖ggplot2之外,Hadley的书还提供了处理数据的重要提示。

首先,我建议您使用reshape2套餐来melt您的数据:

(我创建了一个虚设,因此其他人更容易跟随)

library(reshape2)
nObs = 10
df = data.frame(
    scal = rnorm(nObs), 
    var1 = rbinom(nObs, 1, 0.5),
    var2 = rbinom(nObs, 1, 0.5),
    var3 = rbinom(nObs, 1, 0.5))

然后将数据“融化”为long form from wide form

df2 = melt(df, id.vars = c('scal'), 
    variable.name ='myVars', value.name = "zeroOne")

现在,您可以使用boxplot base创建所需的Renter image description here

但是,花时间学习ggplot2可以让你创建这样的数字: enter image description here

使用如下代码:

library(ggplot2)
ggplot(data = df2, aes(x = zeroOne, y = scal)) + 
    geom_boxplot(aes(fill = myVars))

注意ggplot2可以创建比这更漂亮的图表(并且比base R更容易这样做!)我建议您浏览ggplot2 {{ 3}}查看更多示例。您可能还希望尝试交换zeroOnemyVars,因为它会更改绘图分组。


答案 1 :(得分:1)

Plotluck是一个基于 ggplot2 的库,旨在根据1-3个变量的特征自动选择绘图类型。以下是结果图的示例:

nObs = 100
df = data.frame(
    scal = rnorm(nObs), 
    var1 = rbinom(nObs, 1, 0.5),
    var2 = rbinom(nObs, 1, 0.5),
    var3 = rbinom(nObs, 1, 0.5))
plotluck.multi(df, y=scal, opts=plotluck.options(use.geom.violin=F))

此命令意味着:将列scal(在y轴上)映射到df中的每个其他列(在x轴上;包括其自身,产生密度或直方图)。我们指定use.geom.violin=F来强制执行箱形图,因为默认是小提琴图,它通常可以更好地传达分布的形状。如果行数非常低,则将绘制单个点。

enter image description here