如何仅对数据集中的定量变量使用sapply()函数计算统计量?
解决定量变量描述性统计报错问题
你想计算数据集中定量变量的均值、中位数、极值和标准差,但数据里混有分类变量,即便加了na.rm = TRUE参数,还是反复出现报错。
你使用的代码:
sapply(data, function(x) c("Stand dev" = sd(x, na.rm =TRUE), "Mean"= mean(x,na.rm=TRUE), "Median" = median(x, na.rm=TRUE), "Minimum" = min(x, na.rm =TRUE), "Maximun" = max(x, na.rm =TRUE)))
报错信息(翻译后):
警告:强制转换时产生了NA
警告:参数不是数值型或逻辑型:返回NA
警告:强制转换时产生了NA
警告:参数不是数值型或逻辑型:返回NA
警告:强制转换时产生了NA
警告:参数不是数值型或逻辑型:返回NA
问题原因
sapply会遍历数据集的每一列,包括分类变量(比如字符型、因子型),但sd、mean这些统计函数只能处理数值型变量,强行计算分类变量时R会尝试把它转成数值,失败后就抛出警告并返回NA。
解决方法
方法1:手动筛选数值型列再计算
可以先提取数据集中的数值型子集,再执行统计,结果更干净:
# 提取所有数值型列 numeric_cols <- data[sapply(data, is.numeric)] # 对数值型列计算统计量 sapply(numeric_cols, function(x) c( "标准差" = sd(x, na.rm = TRUE), "均值" = mean(x, na.rm = TRUE), "中位数" = median(x, na.rm = TRUE), "最小值" = min(x, na.rm = TRUE), "最大值" = max(x, na.rm = TRUE) ))
也可以在sapply内部加判断,跳过非数值型列:
sapply(data, function(x) { if (is.numeric(x)) { c( "标准差" = sd(x, na.rm = TRUE), "均值" = mean(x, na.rm = TRUE), "中位数" = median(x, na.rm = TRUE), "最小值" = min(x, na.rm = TRUE), "最大值" = max(x, na.rm = TRUE) ) } })
方法2:用dplyr包简化操作
如果熟悉tidyverse系列包,用dplyr的语法会更简洁直观:
library(dplyr) data %>% # 筛选数值型列 select_if(is.numeric) %>% # 对每列计算指定统计量 summarise_all(list( 标准差 = ~sd(., na.rm = TRUE), 均值 = ~mean(., na.rm = TRUE), 中位数 = ~median(., na.rm = TRUE), 最小值 = ~min(., na.rm = TRUE), 最大值 = ~max(., na.rm = TRUE) ))
内容的提问来源于stack exchange,提问作者ish
相关产品推荐
相关产品推荐

