【问题标题】:How to get the mean, and, include mean to a plot for numeric data如何获得平均值,并将平均值包含在数字数据的图中
【发布时间】:2015-11-01 23:17:41
【问题描述】:

我是新手 R 用户并已查看网站上的相关问题。虽然在我遇到一些我无法解决的其他问题之前已经询问了我的问题的标题。

我能够成功使用 R 控制台制作箱线图,其中包含我通过 .csv 导入的数据,其中包含一些 NA 值(使用 boxplot(Test)),其中 Test 是我的数据的名称,包括 3 列数据,每列带有 20 个数据点的标签。

但是当我尝试计算平均值时(通过使用:mean(Test) 或尝试将其添加到成功制作的箱线图中(通过使用:abline(v=mean(Test)),它给了我以下警告消息:

Warning message:
In mean.default(Test) : argument is not numeric or logical: returning NA

现在当我尝试:sapply(Test, mean, na.rm = TRUE) 时,我确实得到了正确的结果,但随后出现了警告消息:

Warning message:
In mean.default(X[[i]], ...) :
  argument is not numeric or logical: returning NA

使用Summary (Test) 时,所有正确的计算都会出现,没有任何警告消息。 我对问题是什么感到困惑?任何建议都会有帮助!谢谢你

更新 2: 感谢您在下面的回答,效果很好。

更新1: 感谢那些在下面提供帮助的人 - 使用 colMeans(Test, na.rm=TRUE) 返回我所有列的方法。 但是,是否可以将每个单独数据列的平均值作为一个点添加到所有数据(即所有三列)的箱线图中?使用abline(v=colMeans(Test)) 只会在整个图中添加一行。

附加信息: 当我使用:class(Test) 时,它会返回:

[1] "data.frame"

我还使用sapply(Test, mode) 检查了我的数据类型(如果我使用了任何不正确的词,请致歉),它会为我的所有 3 列数据返回“numeric”。

仅部分数据集

a       b       c
0.68    0.68    0.68
0.28    0.28    0.28
0.62    0.62    0.62
0.73    0.73    0.73

【问题讨论】:

  • 对于mean,您需要指定列,即mean(Test[,1]),以获得第一列的平均值。如果有多个列,colMeans(Test) 会给出每列的mean。你能显示一个示例数据吗
  • 你可能有一个factor。它们是类别的numeric 表示,但您无法对它们进行数学运算。例如。 factor(c("male","female")) 是什么意思?没有意义。试试sapply(Test, class)
  • 这是因为您没有将所有列都设为数字。有些列可能是因子或字符类。
  • dput(head(Test,1)) 显示什么?这将一劳永逸地解决这个问题。
  • 三列有 20 个数据点是一个小集合。为什么不在帖子中复制dput(Test) 的整个输出?

标签: r plot warnings


【解决方案1】:

这是一个示例,说明如何使用三个数值变量创建箱线图,并为每个变量添加均值点。

#Create example data, including some NA values
set.seed(13121)
test = data.frame(a = c(rnorm(99, 1, 1), NA), 
                  b = c(NA, rnorm(99, 0, 1)), 
                  c = rnorm(100, 2, 2))


#Calculate means for each of the columns
means = colMeans(test)

在这种情况下,前两列的结果返回 NA,因为其中有 NA 值:

means
#       a        b        c 
#      NA       NA 2.021736 

解决方案是添加na.rm = TRUE选项(更多信息请参见?colMeans):

means = colMeans(test, na.rm = TRUE)
means
#         a          b          c 
# 0.9843446 -0.1428516  2.0217361

现在我们准备好绘制箱线图并使用计算的平均值添加点:

boxplot(test)
points(means, col = "red")

结果:

【讨论】:

  • 谢谢,这成功了!但是,当我用更长的名称(即 14 个字符长)重新执行此操作并添加了几个变量时,该图要么只显示每隔一个名称(如果是水平的),要么是剪掉一些字母(如果是垂直的,使用 las=2'). The axis title also overlaps with the labels. Although cex. axis`减少了字体,对我来说太小了。有没有办法让整个轴名称保持正常大小(`cex.axis = 1)并且不会丢失14个字符名称中的一些字母?谢谢又是你。
  • @Ameno:对于你的标签被切割的问题,你可以在做箱线图之前用par调整绘图的边距大小。例如:par(mar = c(10, 4, 4, 2))。尝试不同的号码以查看最适合您的号码,并查看?par 了解更多信息。对于轴标题,不要在箱线图函数中使用xlab,而是在绘制箱线图后使用mtext。例如:mtext(text = "x title", side = 1, padj = 14)。再次使用padj 参数。请参阅this post 了解更多信息。
  • 谢谢@hugo,这一切都有帮助,我正在尝试不同的方法来看看有什么用。您的输入非常有帮助,所以我想问一下是否有办法控制箱线图轴上的小数位数或 sig figs?我还没能做到这一点。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2021-09-25
相关资源
最近更新 更多