箱线图单标量变量“;由「;r数据中的多个真/假变量

箱线图单标量变量“;由「;r数据中的多个真/假变量,r,boxplot,R,Boxplot,几个月来,我一直在r数据上步履蹒跚。抱歉,如果这些看起来都是基本的。我一直在寻找各种密切相关的问题和解决方案,但不知何故,我似乎无法使它们适应我的情况。我开始怀疑这是否是我应该尝试去做的事情,但我想问一下也无妨 我有一个数据帧,它有一个标量变量和多个T/F(是/否;1/0,1/2)变量。像这样: scal var1 var2 var3 25 0 1 0 21 0 1 1 14 1 1 0 30 1

几个月来,我一直在r数据上步履蹒跚。抱歉,如果这些看起来都是基本的。我一直在寻找各种密切相关的问题和解决方案,但不知何故,我似乎无法使它们适应我的情况。我开始怀疑这是否是我应该尝试去做的事情,但我想问一下也无妨

我有一个数据帧,它有一个标量变量和多个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
我知道我可以制作一个箱线图,使用单个变量的“by”将标量变量列划分为多个类别,如下所示:

boxplot(df$scal~df$var1)
我还知道我可以一次绘制多个标量变量的方框图。我想以某种方式将两者结合起来,形成一个箱线图,它可以将每个变量的“真”子集和“假”子集的因变量相邻地绘制出来。在我的世界中,一个解决方案应该类似于“箱线图(df$scal~df$var1,df$scal~df$var2,df$scal~df$var3)”,但我不同意r数据。关于不能强制使用数据类型

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

我还考虑重新排列数据集,使“真”和“假”集位于不同的列中(使用子集(df$var1,df$var1==1)等),然后如前所述制作多个箱线图。(尽管这很乏味)

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


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

学习如何在
R
中操作数据在刚开始的时候都很困难。我同意@jentjr的观点,学习
ggplot2
会很有帮助,哈德利的书除了介绍
ggplot2
之外,还提供了处理数据的好技巧

首先,我建议使用该软件包来融化您的数据:

(我创建了一个虚拟集合,以便其他人更容易跟随)

然后将数据“融化”到内存中

现在,您可以使用
base
R
创建所需的
箱线图

但是,投入时间学习
ggplot2
将允许您创建如下图形:

使用如下代码:

library(ggplot2)
ggplot(data = df2, aes(x = zeroOne, y = scal)) + 
    geom_boxplot(aes(fill = myVars))
ggplot2
可以制作比这更奇特的绘图(而且比
base
R
!)更容易),我鼓励您浏览
ggplot2
以查看更多示例。您可能还希望尝试交换
zeroOne
myVars
,因为这会更改打印分组


是一个基于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.violen=F
来强制使用方框图,因为默认情况下是小提琴图,它通常可以更好地传达分布的形状。如果行数非常少,将绘制单个点


我认为使用
ggplot2
会让你的生活简单得多。你可以查看这篇文章,它是条形图,但我认为这和你所寻找的想法是一样的。我见过类似的解决方案。但这几乎是相反的。它们有一个分类变量和多个标量,我有一个标量和多个分类变量。我无法适应这些方法。谢谢。虽然有些混乱,但这有帮助。我已经看到了很多关于melt()函数的东西,但这不是我所期望的。这种联系可能帮助最大。为了完成这项工作,我使用了
boxplot(scale~myVars*zeroOne,data=df2)
ggplot(data=df2,aes(x=interaction(zeroOne,myVars),y=scal))+geom_boxplot(aes(fill=zeroOne))
来获得我最终需要的东西。
df2 = melt(df, id.vars = c('scal'), 
    variable.name ='myVars', value.name = "zeroOne")
library(ggplot2)
ggplot(data = df2, aes(x = zeroOne, y = scal)) + 
    geom_boxplot(aes(fill = myVars))
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))