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 查看更多示例。您可能还希望尝试交换 zeroOne
和 myVars
,因为它会更改绘图分组。
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
强制使用箱线图,因为默认是小提琴图,它通常可以更好地表达分布的形状。如果行数很低,将绘制单个点。
几个月来,我一直在绕过 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 查看更多示例。您可能还希望尝试交换 zeroOne
和 myVars
,因为它会更改绘图分组。
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
强制使用箱线图,因为默认是小提琴图,它通常可以更好地表达分布的形状。如果行数很低,将绘制单个点。