循环和编程

先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。

ado

更新已安装的包

Stata

ado update

R 包:utils

update.packages()

capture

运行代码,出错时不中断

Stata

capture command

R 包:tidystata

capture(expression)

capture() 返回 TRUE 或 FALSE;若要保留错误信息,请用 try()。

clear

删除所有对象

Stata

clear all

R 包:base

rm(list = ls())

重启 R(RStudio 中的 Session > Restart R)才是真正干净的开始。

cls

清空控制台

Stata

cls

R 包:base

cat("\014")

在 RStudio 中也可以按 Ctrl+L。

display

提取某个系数

Stata

display _b[x]

R 包:stats

coef(fit)["x"]

提取某个标准误

Stata

display _se[x]

R 包:stats

sqrt(diag(vcov(fit)))["x"]

ereturn

模型的统计量

Stata

ereturn list

R 包:broom

broom::glance(fit)

broom::tidy(fit) 给出系数表,names(fit) 列出所有存储的内容。

foreach

对一些变量跑循环

Stata

foreach v of varlist v1-v5 { generate `v'_sq = `v'^2 }

R 包:dplyr

mutate(data, across(v1:v5, ~ .x^2, .names = "{col}_sq"))

across() 可以代替大部分对变量的循环;其他循环可用 for (v in names) { … }。

forvalues

对一些变量跑循环(带有条件语句)

Stata

forvalues i = 1/5 { generate v`i'_sq = v`i'^2 if v`i' > 0 }

R 包:dplyr

mutate(data, across(v1:v5, ~ if_else(.x > 0, .x^2, NA), .names = "{col}_sq"))

对一些变量跑循环(变量名中有特定数字)

Stata

forvalues i = 6/10 { forvalues j = 3/5 { replace x_`i'_`j' = x_`i'_`j' + 1 } }

R 包:dplyr

mutate(data, across(matches("^x_([6-9]|10)_[3-5]$"), ~ .x + 1))

用正则表达式选择变量名。只需要一个数字范围时,可用 varlist(“x_[6-10]_*“)。

frame

保存另一份数据

Stata

frame create other

R 包:tibble

other <- tibble()

R 可以同时保存任意多个数据框,各为独立的对象,相当于自带 frames。

if

条件成立时才运行代码

Stata

if `x' > 0 { display "positive" }

R 包:base

if (x > 0) print("positive")

需要加引号:findit(“if”),因为 if 是 R 的保留字。

local

存储变量名列表

Stata

local vars x1 x2 x3

R 包:base

vars <- c("x1", "x2", "x3")

与 all_of() 一起使用:select(data, all_of(vars)) 或 across(all_of(vars), …)。

macro

列出已定义的对象

Stata

macro list

R 包:base

ls()

matrix

生成矩阵

Stata

matrix A = (1, 2 \ 3, 4)

R 包:base

A <- matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE)

preserve

保存一份数据副本

Stata

preserve

R 包:base

backup <- data

R 不会原地修改数据,保留原对象、把结果赋给新名字即可;restore 相当于 data <- backup。

program

编写自己的命令

Stata

program define myprog

R 包:base

myprog <- function(data) { summ(data) }

quietly

运行但不显示输出

Stata

quietly regress y x

R 包:stats

fit <- lm(y ~ x, data = data)

赋值的结果不会打印;之后用 print(fit) 或 summary(fit) 显示。

return

查看命令存储的结果

Stata

return list

R 包:tidystata

str(summ(data, x))

R 的结果是普通对象:赋值后可以提取其中的部分,例如 s <- summ(data, x); s$mean。

scalar

存储单个数值

Stata

scalar a = 3

R 包:base

a <- 3

set

设定随机数种子

Stata

set seed 2024

R 包:base

set.seed(2024)

与 Stata 有差异 set_seed(.fn, seed) 可以在管道中设定种子;请参阅 sample 的条目。 R 与 Stata 使用不同随机数流;相同数值种子不会复现相同随机数或抽样行。

查找错误发生的位置

Stata

set trace on

R 包:base

traceback()

debug(f) 或 browser() 可以逐行运行函数。

tempfile

临时文件

Stata

tempfile f

R 包:base

f <- tempfile(fileext = ".rds")

R 中不需要临时变量:中间结果可以之后删除,或保存为单独的对象。

timer

计算代码运行时间

Stata

timer on 1

R 包:tidystata

timer(expression)

version

版本控制

Stata

version 18

R 包:base

R.version.string

renv::snapshot() 记录包的版本,便于以后重现项目。

which

查看命令来自哪里

Stata

which summarize

R 包:utils

getAnywhere("summ")

while

条件成立时重复执行

Stata

while `i' < 10 { local i = `i' + 1 }

R 包:base

while (i < 10) { i <- i + 1 }