You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:50:12