跳至主要内容

R sd() 函数:R 中的标准差

学习如何使用 R 的 sd() 函数衡量数据的离散程度。了解实用示例以及处理缺失值和分组数据的关键技巧。
· 5分钟 阅读

使用 AI 探索

标准差是汇总数据分散程度的最常用方法之一。在 R 中,sd() 函数可以快速计算这一变异性指标,无论您处理的是向量、数据框还是分组数据。

本文将带您了解在 R 中使用 sd() 的基础知识,探讨如何处理缺失值,并演示如何使用 tapply() 等函数以及 dplyr 等包来按组计算标准差。

sd() 在 R 中的作用是什么?

在 R 中,基础 R 的 sd() 函数用于计算数值向量或数据框列的标准差。它度量数据值相对于均值的偏离程度,从而反映出数据的变异性或离散度。

如果您熟悉方差的概念,标准差就是它的平方根。由于其计算方式(对平均平方偏差开方),标准差与原始数据保持相同的量纲,这让其在实践中更易解释。

一个简单的 sd() 示例

假设您有一组数字,想了解它们相对平均值的波动程度。

在 R 中可以这样做:

exam_scores <- c(75, 80, 85, 90, 95) 
sd(exam_scores) 

输出会给出标准差,用以量化每个分数与均值的平均距离。

您可以将 sd() 用于任何数值向量,包括整数、双精度数,或计算结果。您或许知道 R 会把逻辑向量当作数值(TRUE 为 1,FALSE 为 0),因此 sd() 从技术上说也能作用于逻辑向量(您可以试试),但标准差的概念对连续型数值数据最有意义。

用 sd() 处理缺失值

真实世界的数据集经常包含缺失值,需要特别说明:如果数据中包含任何 NA,sd() 默认会返回 NA。

来看这个例子:

heights <- c(170, 175, NA, 180, 185)
sd(heights)

结果是 NA。

若要忽略缺失值并仅对可用数字计算标准差,请使用参数 na.rm = TRUE。或者,您也可以清理数据集中的 NA 值,但我建议仅在确有必要时这么做。

sd(heights, na.rm = TRUE) 

现在您会得到 170、175、180 和 185 的标准差。

在 R 中为数据框计算标准差

您可以通过 $ 运算符轻松计算数据框中特定列的标准差。假设您有一个产品重量的数据框:

product_data <- data.frame( weight = c(1.2, 1.5, 1.3, 1.7, 1.4), price = c(10, 12, 11, 13, 12) ) 
sd(product_data$weight)

这会给出 weight 列的标准差。请记住,sd() 适用于数值向量,而非整个数据框。务必选择合适的列。

sd() 与分组标准差

很多时候,您需要按组衡量变异性,比如按类别、区域或其他因素。R 提供了多种按组计算标准差的方法。我将展示三种:

使用 tapply() 计算分组标准差

假设您有不同区域的销售数据,想要计算每个区域的标准差:

sales_amount <- c(200, 220, 210, 250, 240, 230) 
region <- c("North", "North", "South", "South", "North", "South") 
tapply(sales_amount, region, sd)

tapply() 会将 sd() 应用于按区域划分的每个分组。

使用 aggregate() 计算分组标准差

如果您更偏好整洁的数据框形式,aggregate() 也很好用:

sales_data <- data.frame( region = c("North", "North", "South", "South", "North", "South"), amount = c(200, 220, 210, 250, 240, 230) ) 
aggregate(amount ~ region, data = sales_data, sd)

这会生成一个汇总数据框,包含各区域的标准差。

使用 dplyr 计算分组标准差

借助 dplyr 包,分组计算会更易读。分组后使用 summarize():

library(dplyr) 

sales_data %>% 
   group_by(region) %>% 
   summarize(sd_amount = sd(amount))

这种方法在处理大型数据集或需要链式进行多步数据转换时尤其有用。(或者如果您像我一样,单纯偏爱管道操作符。)

常见错误与提示

即便是像 sd() 这样简单的函数,如果不注意也会出问题。以下是一些常见陷阱:

  • 非数值数据:sd() 只适用于数值向量。如果数据包含字符或因子,就会报错。请用 is.numeric() 检查数据。

  • 缺失值:一个 NA 就会导致 sd() 返回 NA。若要忽略缺失值,请务必使用 na.rm = TRUE。

  • 样本量过小:sd() 在分母中使用 n-1(样本标准差)。对于长度为 1 的向量,sd() 返回 NA,而不是 0。

我认为尤其是最后一点很有意思。这是一个不太为人熟知的差异,它可能会在您从 Python 转到 R 时绊您一下,因为 Python 默认按总体标准差来除,而不是样本。

R 中的实用变体与相关函数

R 提供了若干用于度量变异性和汇总数据的相关函数:

  • var():计算方差,即标准差的平方。

  • apply()、sapply()、lapply():用于在矩阵和数据框的行或列上应用 sd()。

  • mad():计算中位数绝对偏差,这是另一种有趣且更稳健的变异性度量。

既然提到了 apply() 配合 sd() 的用法,就给您演示一下:如下利用 apply() 计算矩阵每一列的标准差。和之前一样,我会即时创建该矩阵。

measurement_matrix <- matrix(1:9, nrow = 3) 
apply(measurement_matrix, 2, sd)

这将返回每一列的标准差,帮助您快速了解多个变量的离散程度。

结语

R 中的 sd() 函数相对简单(只需一行代码)。但如果您在报告或演示中经常使用它,而对一些细节还有些模糊,欢迎报名我们的 Statistician in R 职业路径课程。统计与数据分析中有许多细微之处,请务必打好基础、融会贯通。

Josef Waples

作者

Josef Waples

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。

主题