描述性表格

先查看各命令展开的示例,再按需展开其他选项及 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)

用组内总和替代原始行

Stata

collapse (sum) z=x, by(g)

R 包:dplyr

data <- dplyr::summarise(data,z=sum(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) zero

R 包: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, nomiss

R 包:dplyr

data <- dplyr::count(data[!is.na(data$g)&data$g!='',,drop=FALSE],g,name='_freq')

与 Stata 有差异 同时排除空字符串与 R NA,以对应 Stata 非缺失字符串类别。

summarize

计算详细经验百分位数

Stata

summarize x, detail

R 包: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;不返回偏度与峰度。

另有 1 个示例及替代实现

计算均值型摘要要素

Stata

summarize x, meanonly

R 包:base

c(n=sum(!is.na(data$x)),mean=mean(data$x,na.rm=TRUE),min=min(data$x,na.rm=TRUE),max=max(data$x,na.rm=TRUE))

tab1

分别生成多个单变量频数表

Stata

tab1 g h

R 包:base

lapply(data[c('g','h')],table)

tab2

生成各变量对的列联表

Stata

tab2 g h k

R 包:base

pairs <- utils::combn(c('g','h','k'),2,simplify=FALSE); lapply(pairs,function(p) table(data[[p[1]]],data[[p[2]]]))

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

统计单个类别变量频数

Stata

tabulate g

R 包:base

table(data$g)
另有 7 个示例及替代实现

使用整数频数权重制表

Stata

tabulate g [fw=w]

R 包:stats

stats::xtabs(w~g,data=data,na.action=stats::na.pass)

生成二维列联频数表

Stata

tabulate g h

R 包:base

table(data$g,data$h)

计算占全表的单元格百分比

Stata

tabulate g h, cell

R 包:base

100*prop.table(table(data$g,data$h))

计算列联表列内百分比

Stata

tabulate g h, column

R 包:base

100*prop.table(table(data$g,data$h),margin=2)

计算列联表行内百分比

Stata

tabulate g h, row

R 包: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, missing

R 包:base

table(data$g,useNA='ifany')

与 Stata 有差异 将 R NA 列为独立类别;空字符串在 R 中仍是另一种值。