r 数据中的箱线图单个标量变量 "by" 多个 true/false 变量

boxplot single scalar variable "by" multiple true/false variables in r data

几个月来,我一直在绕过 r 数据。对不起,如果这些看起来很基本。我一直在寻找各种接近的问题和解决方案,但不知何故我似乎无法使它们适应我的情况。开始怀疑这是否是我应该尝试做的事情,但我想问问也无妨。

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

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

我知道我可以制作一个箱线图,使用 "by" 对单个变量将标量变量列分成几类,如下所示:

boxplot(df$scal~df$var1)

我也知道我可以一次为多个标量变量制作箱线图。我想以某种方式将两者结合起来制作一个箱线图,它可以绘制每个 "true" 子集的因变量和每个变量的 "false" 子集。在我的世界里,一个解决方案应该看起来像 "boxplot(df$scal~df$var1, df$scal~df$var2, df$scal~df$var3)",但 r data 不同意我的看法。关于无法强制数据类型的事情。

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

我还考虑过重新排列数据集,使 "true" 和 "false" 集位于不同的列中(使用 subset(df$var1, df$var1==1) 等。 ), 然后如前所述制作多个箱线图。 (虽然这很乏味)

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 等),然后将其导入。空值将保持不变,但我真的不想手动执行此操作。就像人们想象的那样,这变得非常乏味,并且在更大的范围内容易出错。

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

刚开始学习如何在 R 中操作数据可能会很困难。我同意 @jentjr 的观点,学习 ggplot2 会有所帮助,Hadley 的书除了涵盖 ggplot2 之外还提供了处理数据的重要技巧。

首先,我建议使用 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")

现在您可以使用 base R 创建您想要的 boxplot

但是,花时间学习 ggplot2 可以让您创建如下图:

使用这样的代码:

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

注意 ggplot2 可以制作比这更漂亮的情节(并且比 base R 更容易做到!)我鼓励您浏览 ggplot2 webpage 查看更多示例。您可能还希望尝试交换 zeroOnemyVars,因为它会更改绘图分组。


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-axis 上)与 df 中的其他列(在 x-axis 上;包括它本身,得出一个密度或直方图)。我们指定 use.geom.violin=F 强制使用箱线图,因为默认是小提琴图,它通常可以更好地表达分布的形状。如果行数很低,将绘制单个点。