如何在R中排除缺失值编码后计算列级汇总统计量?
问题:自定义统计函数无法排除编码为-99999的缺失值
我编写了自定义函数ord_table(),用于从数据框中提取汇总统计量,需排除以大负数(如-99999)编码的缺失值。列名存储在向量ord_vars中,使用lapply调用该函数处理数据框列,但子集化步骤未生效,统计结果仍包含缺失值编码。尝试过filter()、subset()及unquote(x),均未解决问题。当前统计结果包含缺失值,期望得到排除缺失值后的正确列级统计量(中位数、最小值、最大值、四分位距等)。
示例数据
> data var1 var2 var3 var4 1 3 2 2 1 2 -99999 3 1 1 3 3 5 -99999 2 4 2 3 3 3 5 2 3 4 4 6 -99999 1 -99999 5 7 3 4 1 5 8 5 1 3 3 9 4 1 5 -99999 10 -99999 5 4 1 11 -99999 3 2 2 12 1 2 5 5
调用代码
ordinal <- lapply(ord_vars, ord_table)
自定义函数(原错误版本)
ord_table <- function(x) { table_ord <- data.frame(Median=double(length=1), Minimum=double(length=1), Maximum=double(length=1), IQR=double(length=1)) table_ord$Median <- data %>% subset(x > 0) %>% pull(x) %>% median() table_ord$Minimum <- data %>% subset(x > 0) %>% pull(x) %>% min() table_ord$Maximum <- data %>% subset(x > 0) %>% pull(x) %>% max() table_ord$IQR <- data %>% subset(x > 0) %>% pull(x) %>% IQR() return(table_ord) }
错误结果
[[1]] Median Minimum Maximum IQR 1 2 -99999 5 100002.2
期望结果
[[1]] Median Minimum Maximum IQR 1 2.5 2 5 2.25
可复现数据代码
set.seed(123) ## 保证结果可复现 a <- c(1, 2, 3, 4, 5, -99999) var1 <- sample(a, 12, replace=TRUE) var2 <- sample(a, 12, replace=TRUE) var3 <- sample(a, 12, replace=TRUE) var4 <- sample(a, 12, replace=TRUE) data <- cbind(var1, var2, var3, var4) %>% as.data.frame() ord_vars <- data %>% colnames() %>% as.vector()
解决方案
问题核心:原函数中x是列名的字符串,subset(x > 0)不会将x解析为数据框的列名,而是当作独立变量,导致过滤条件失效,所有行都被保留,统计时包含了-99999。
修改后的函数(基础版)
直接提取目标列并过滤缺失值编码,再计算统计量:
ord_table <- function(x) { # 提取目标列并过滤掉缺失值编码 filtered_col <- data[[x]][data[[x]] > 0] table_ord <- data.frame( Median = median(filtered_col), Minimum = min(filtered_col), Maximum = max(filtered_col), IQR = IQR(filtered_col) ) return(table_ord) }
修改后的函数(tidyverse风格)
用.data代词正确引用列,结合dplyr语法实现:
library(dplyr) ord_table <- function(x) { data %>% filter(.data[[x]] > 0) %>% pull(.data[[x]]) %>% {data.frame( Median = median(.), Minimum = min(.), Maximum = max(.), IQR = IQR(.) )} }
调用后即可得到期望结果:
ordinal <- lapply(ord_vars, ord_table) # 查看var1的统计结果 ordinal[[1]] # Median Minimum Maximum IQR # 1 2.5 1 5 2.25
内容的提问来源于stack exchange,提问作者Suzanne Segerstrom
相关产品推荐
相关产品推荐

