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