使用lapply函数创建多个绘图时,从每个绘图中删除未使用的x轴因子

时间:2018-03-21 07:15:50

标签: r ggplot2

我有一个宽格式的数据框,其中包含人口统计详细信息和各种问卷分数。

数据集如下所示:

id <- c(1, 2, 3, 4, 5)
gender <- c("Male", "Female", "Male", "Female", "Male")
group <- c("A", "A", "B", "C", "B")
subscale_1 <- c(NA, NA, 3, 2, 3)
subscale_2 <- c(3, 3, NA, 2, NA)
subscale_3 <- c(3, 2, 5, NA, 1)
subscale_4 <- c(1, NA, 3, NA, 5)
subscale_5 <- c(NA, 5, NA, 8, NA)
df <- data.frame(id, gender, group, subscale_1, subscale_2, 
                           subscale_3, subscale_4, subscale_5)

我想循环创建多个箱图,其中x轴是人口统计列之一,而y轴是问卷分数列之一。例如,我的一个箱形图可以具有组的x轴,其中y轴为subscale_1。

但是,并非每个参与者都必须回答特定问卷。因此,将有不同的参与者组在特定的问卷评分栏中具有NA。例如,属于A组的人将在subscale_1列中拥有NA。对于subscale_2列,B组中的参与者不需要完成它等等。

在循环创建箱图时,我希望R从x轴中删除这些未使用的因子。因此,箱形图(x = group,y = subscale_1)应仅包含x轴上的B组和C组。同样,一个箱形图,其中(x = group,y = subscale_2)应该只包含x轴上的A组和C组。

我设法使用以下代码循环创建多个图:

lapply(names(df)[which(names(df) == "subscale_1"):
                     which(names(df) == "subscale_5")], function(x) 
                {ggplot(df, aes_string(x = "group", y = x)) + geom_boxplot()})

我已经关注了其他一些Stackoverflow线程,其他人建议为scale_x_discrete和scale_fill_discrete添加drop = TRUE。我已经尝试过,但未使用的x轴因子不会从创建的箱图中删除。一个非常有用的线程here建议使用df [!is.na(df $ questionnaire_column),],但由于我的y轴不同,我不知道如何将迭代指定为我的lapply代码。

将来,我仍然会做类似于上面的事情。我可能正在使用条形图,而不是箱形图。简单地用geom_bar替换geom_boxplot仍然可以使代码工作,或者我是否需要在编辑代码时进行大修?因为我正在考虑通过所有问卷评分栏中的特定人口统计变量(例如,群体,性别等)来查看均值/中位数。

谢谢!

0 个答案:

没有答案