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

如何用R实现Stata式数据集缺失值等占比统计并导出Excel

Stata转R:变量缺失/空值/零值/特殊编码占比统计实现

需求说明

作为资深Stata用户,需在R中实现以下功能:生成可导出至Excel的数据框,统计数据集中各变量的缺失值占比、空值占比、特殊编码(如-99、-77,即小于0的数值)占比、零值占比;需自动区分数值型与字符型变量——零值、特殊编码统计仅适用于数值型变量。

原Stata实现代码

* Load dataset
sysuse auto, clear

* Save the total number of observations in a local
count
loc N = `r(N)'


*** Numeric Vars
* Identify numeric variables in the dataset
qui ds, has(type numeric)
qui ds `r(varlist)'
loc numeric_vars "`r(varlist)'"
* Loop through numeric variables calculating the # of missing, empty, DK/RF and zero cases
foreach var in `numeric_vars' {
    qui count if `var' == .
    loc `var'_miss = `r(N)'
    loc `var'_empty = `r(N)' == _N
    qui count if `var' < 0
    loc `var'_dkrf = `r(N)'
    qui count if `var' == 0
    loc `var'_zero = `r(N)'
}

    
*** String Vars
* Identify string variables in the dataset
qui ds, has(type string)
qui ds `r(varlist)'
loc string_vars "`r(varlist)'"
* Loop through numeric variables calculating the # of missing, empty DK/RF cases
foreach var in `string_vars' {
    qui count if `var' == ""
    loc `var'_miss = `r(N)'
    loc `var'_empty = `r(N)' == _N
    loc `var'_dkrf = `r(N)'
}
* Transpose the dataset
xpose, clear var
keep _varname

* Generate place holder variables
gen empty = .
gen missing = .
gen dkrf = .
gen zero = .
    
* Loop through numeric variables counting the number of each cases
foreach var in `numeric_vars' {

        qui replace empty = ``var'_empty' if _varname == "`var'"
        qui replace missing = ``var'_miss' if _varname == "`var'"
        qui replace dkrf = ``var'_dkrf' if _varname == "`var'"
        qui replace zero = ``var'_zero' if _varname == "`var'"

    }
* Loop through string variables counting the number of each cases
foreach var in `string_vars' {

        qui replace empty = ``var'_empty' if _varname == "`var'"
        qui replace missing = ``var'_miss' if _varname == "`var'"
        qui replace dkrf = ``var'_dkrf' if _varname == "`var'"

    }
foreach var of varlist empty missing dkrf zero {
        replace `var' = round((`var' * 100) / `N', 0.2)
}

已完成的R数据加载代码

library(haven)
# Load Stata file
df = read_dta("http://www.stata-press.com/data/r9/auto.dta")

对应R实现方案

以下代码完全匹配Stata逻辑,自动区分变量类型并统计各类占比,最终导出至Excel:

# 加载所需包
library(haven)
library(dplyr)
library(tidyr)
library(openxlsx)

# 加载Stata数据集
df <- read_dta("http://www.stata-press.com/data/r9/auto.dta")

# 获取总观测数
total_obs <- nrow(df)

# 定义变量统计函数,匹配Stata逻辑
var_stats <- function(var, total_n) {
  var_type <- class(var)[1]
  
  # 初始化统计结果
  stats <- list(
    missing_pct = 0,
    empty_pct = 0,
    dkrf_pct = 0,
    zero_pct = 0
  )
  
  # 计算缺失值(NA)占比
  stats$missing_pct <- round(sum(is.na(var)) / total_n * 100, 2)
  
  if (var_type %in% c("character", "factor")) {
    # 字符/因子型变量:统计空字符串占比,Stata中DK/RF与空值等价
    empty_count <- sum(var == "", na.rm = TRUE)
    stats$empty_pct <- round(empty_count / total_n * 100, 2)
    stats$dkrf_pct <- stats$empty_pct
  } else if (var_type %in% c("numeric", "integer", "dbl")) {
    # 数值型变量:判断是否全缺失(对应Stata的empty逻辑)
    stats$empty_pct <- ifelse(sum(is.na(var)) == total_n, 100, 0)
    # 统计特殊编码(小于0的数值)占比
    dkrf_count <- sum(var < 0, na.rm = TRUE)
    stats$dkrf_pct <- round(dkrf_count / total_n * 100, 2)
    # 统计零值占比
    zero_count <- sum(var == 0, na.rm = TRUE)
    stats$zero_pct <- round(zero_count / total_n * 100, 2)
  }
  
  return(stats)
}

# 遍历所有变量生成统计结果
stats_list <- lapply(df, var_stats, total_n = total_obs)

# 转换为规整的数据框
result_df <- bind_rows(stats_list, .id = "variable_name") %>%
  select(variable_name, missing_pct, empty_pct, dkrf_pct, zero_pct)

# 导出至Excel文件
write.xlsx(result_df, "variable_statistics.xlsx", rowNames = FALSE)

输出说明

最终生成的Excel文件包含5列:

  • variable_name:变量名称
  • missing_pct:缺失值(NA)占比
  • empty_pct:空值/全缺失占比(字符型为空白字符串占比,数值型为全缺失标记)
  • dkrf_pct:特殊编码占比(字符型与空值占比一致,数值型为小于0的数值占比)
  • zero_pct:零值占比(仅数值型变量有有效统计,字符型为0)

内容的提问来源于stack exchange,提问作者Stephen Okiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:55:53