描述性表格
先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。
collapse
用组内非缺失计数替代原始行
Stata
collapse (count) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=sum(!is.na(x)),.by=g)另有 11 个示例及替代实现
用组内含缺失的首值替代原始行
Stata
collapse (first) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=dplyr::first(x),.by=g)用组内首个非缺失值替代原始行
Stata
collapse (firstnm) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=dplyr::first(x[!is.na(x)]),.by=g)用组内含缺失的末值替代原始行
Stata
collapse (last) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=dplyr::last(x),.by=g)用组内最后非缺失值替代原始行
Stata
collapse (lastnm) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=dplyr::last(x[!is.na(x)]),.by=g)用组内最大值替代原始行
Stata
collapse (max) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data, z = if (all(is.na(x))) NA_real_ else max(x, na.rm = TRUE), .by = g)将整数频数加权值汇总为均值
Stata
collapse (mean) x [fw=w]R 包:stats
data <- data.frame(x=stats::weighted.mean(data$x,data$w))与 Stata 有差异 仅为频数加权均值;不涉及推断或加权方差公式。
使用共同完整样本按组汇总
Stata
collapse (mean) x y, cw by(g)R 包:dplyr
data <- data[stats::complete.cases(data[c('x','y')]),]; data <- dplyr::summarise(data,dplyr::across(c(x,y),mean),.by=g)用组内均值替代原始行
Stata
collapse (mean) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=mean(x,na.rm=TRUE),.by=g)用组内中位数替代原始行
Stata
collapse (median) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data,z=stats::median(x,na.rm=TRUE),.by=g)用组内最小值替代原始行
Stata
collapse (min) z=x, by(g)R 包:dplyr
data <- dplyr::summarise(data, z = if (all(is.na(x))) NA_real_ else min(x, na.rm = TRUE), .by = g)contract
统计两个类别的已观测组合频数
Stata
contract g h, freq(n)R 包:dplyr
data <- dplyr::count(data,g,h,name='n')纳入零频数的未观测组合
Stata
contract g h, freq(n) zeroR 包:base
data <- as.data.frame(table(data$g,data$h)); names(data) <- c('g','h','n')用类别频数替代原始观测
Stata
contract g, freq(n)R 包:dplyr
data <- dplyr::count(data,g,name='n')生成累计频数与百分比
Stata
contract g, freq(n) cfreq(cn) cpercent(cp)R 包:dplyr
data <- dplyr::count(data,g,name='n'); data$cn <- cumsum(data$n); data$cp <- 100*data$cn/sum(data$n)生成类别频数与百分比
Stata
contract g, freq(n) percent(p)R 包:dplyr
data <- dplyr::count(data,g,name='n'); data$p <- 100*data$n/sum(data$n)另有 2 个示例及替代实现
从整数频数权重生成类别计数
Stata
contract g [fw=w], freq(n)R 包:dplyr
data <- dplyr::summarise(data,n=sum(w),.by=g)汇总频数前排除缺失类别
Stata
contract g, nomissR 包:dplyr
data <- dplyr::count(data[!is.na(data$g)&data$g!='',,drop=FALSE],g,name='_freq')与 Stata 有差异 同时排除空字符串与 R NA,以对应 Stata 非缺失字符串类别。
summarize
计算详细经验百分位数
Stata
summarize x, detailR 包:base
stats::quantile(data$x,c(.01,.05,.1,.25,.5,.75,.9,.95,.99),na.rm=TRUE,type=2)与 Stata 有差异 对应 summarize detail 的百分位部分,使用 R type 2;不返回偏度与峰度。
tab1
tab2
tabdisp
展示预计算单元值的完整表格
Stata
tabdisp g h, cellvar(value)R 包:stats
stopifnot(!anyDuplicated(data[c('g','h')])); stats::xtabs(value~g+h,data=data,na.action=stats::na.pass)与 Stata 有差异 要求每格均有一行且键唯一;否则 xtabs 会合计重复值或将缺格填为零。
tabstat
比较多列计数、均值与离散程度
Stata
tabstat x y, statistics(n mean sd) columns(statistics)R 包:base
sapply(data[c('x','y')],function(z) c(n=sum(!is.na(z)),mean=mean(z,na.rm=TRUE),sd=stats::sd(z,na.rm=TRUE)))另有 14 个示例及替代实现
按类别汇总非缺失计数与均值
Stata
tabstat x, by(g) statistics(n mean)R 包:dplyr
data |> dplyr::group_by(g) |> dplyr::summarise(n=sum(!is.na(x)),mean=mean(x,na.rm=TRUE),.groups='drop')返回描述统计量:四分位距
Stata
tabstat x, statistics(iqr)R 包:base
with(data,diff(stats::quantile(x,c(.25,.75),na.rm=TRUE,type=2)))与 Stata 有差异 通过 R quantile type 2 使用 Stata 默认经验百分位规则。
返回描述统计量:最大值
Stata
tabstat x, statistics(max)R 包:base
with(data,max(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:均值
Stata
tabstat x, statistics(mean)R 包:base
with(data,mean(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:最小值
Stata
tabstat x, statistics(min)R 包:base
with(data,min(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:非缺失计数
Stata
tabstat x, statistics(n)R 包:base
with(data,sum(!is.na(x)))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:第 25 百分位
Stata
tabstat x, statistics(p25)R 包:base
with(data,as.numeric(stats::quantile(x,.25,na.rm=TRUE,type=2)))与 Stata 有差异 通过 R quantile type 2 使用 Stata 默认经验百分位规则。
返回描述统计量:中位数
Stata
tabstat x, statistics(p50)R 包:base
with(data,stats::median(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:第 75 百分位
Stata
tabstat x, statistics(p75)R 包:base
with(data,as.numeric(stats::quantile(x,.75,na.rm=TRUE,type=2)))与 Stata 有差异 通过 R quantile type 2 使用 Stata 默认经验百分位规则。
返回描述统计量:极差
Stata
tabstat x, statistics(range)R 包:base
with(data,diff(range(x,na.rm=TRUE)))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:样本标准差
Stata
tabstat x, statistics(sd)R 包:base
with(data,stats::sd(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:均值标准误
Stata
tabstat x, statistics(semean)R 包:base
with(data,stats::sd(x,na.rm=TRUE)/sqrt(sum(!is.na(x))))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:总和
Stata
tabstat x, statistics(sum)R 包:base
with(data,sum(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
返回描述统计量:样本方差
Stata
tabstat x, statistics(variance)R 包:base
with(data,stats::var(x,na.rm=TRUE))与 Stata 有差异 非加权描述统计量;不应用调查或抽样设计校正。
tabulate
另有 7 个示例及替代实现
使用整数频数权重制表
Stata
tabulate g [fw=w]R 包:stats
stats::xtabs(w~g,data=data,na.action=stats::na.pass)计算列联表列内百分比
Stata
tabulate g h, columnR 包:base
100*prop.table(table(data$g,data$h),margin=2)计算列联表行内百分比
Stata
tabulate g h, rowR 包:base
100*prop.table(table(data$g,data$h),margin=1)生成完整类别指示变量组
Stata
tabulate g, generate(d)R 包:tidystata
indicators <- tidystata::as_dummy(dplyr::select(data, g), g, .remove = TRUE)与 Stata 有差异 保留全部观测;类别缺失时各虚拟变量均为NA。R返回独立数据框并按类别命名;Stata的前缀d不是可替换的输出变量名。
频数表中包含缺失类别
Stata
tabulate g, missingR 包:base
table(data$g,useNA='ifany')与 Stata 有差异 将 R NA 列为独立类别;空字符串在 R 中仍是另一种值。