我几个月来一直在徘徊数据。对不起,如果这看起来很基本。我一直在寻找各种紧密的问题和解决方案,但不知怎的,我似乎无法适应我的情况。开始怀疑这是否应该是我应该尝试做的事情,但我想要问它是不是很痛苦。
我有一个数据框,它有一个标量变量和多个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等)然后导入它。空值将保持不变,但我真的不想手动执行此操作。正如人们可能想象的那样,这变得相当繁琐,并且在更大的范围内容易出错。
非常欢迎任何一种方法的帮助。
答案 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
创建所需的R
:
但是,花时间学习ggplot2
可以让你创建这样的数字:
使用如下代码:
library(ggplot2)
ggplot(data = df2, aes(x = zeroOne, y = scal)) +
geom_boxplot(aes(fill = myVars))
注意ggplot2
可以创建比这更漂亮的图表(并且比base
R
更容易这样做!)我建议您浏览ggplot2
{{ 3}}查看更多示例。您可能还希望尝试交换zeroOne
和myVars
,因为它会更改绘图分组。
答案 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
来强制执行箱形图,因为默认是小提琴图,它通常可以更好地传达分布的形状。如果行数非常低,则将绘制单个点。