筛选变量或个案

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

drop

删除满足条件的行

Stata

drop if x == 1

R 包:dplyr

filter(data, x != 1 | is.na(x))

Stata 会保留 x 缺失的行;R 中用 | is.na(x) 达到相同效果。

按位置删除行

Stata

drop in 1/4

R 包:dplyr

slice(data, -(1:4))

删除单个变量

Stata

drop x

R 包:dplyr

select(data, -x)
另有 2 个示例及替代实现

删除 x 缺失的行

Stata

drop if missing(x)

R 包:dplyr

filter(data, !is.na(x))

删除多个变量

Stata

drop x1 x3-x5

R 包:dplyr

select(data, -c(x1, x3:x5))

也可以按位置删除:select(data, -c(1, 3:5))。

duplicates

删除完全重复的行

Stata

duplicates drop

R 包:tidystata

duplicates_drop(data)
另有 1 个示例及替代实现

只保留某些变量未重复行

Stata

duplicates drop x1 x2, force

R 包:tidystata

duplicates_drop(data, x1, x2, .force = TRUE)

dplyr 中的对应写法是 distinct(data, x1, x2, .keep_all = TRUE)。

keep

根据某些变量取值,保留数据特定行

Stata

keep if x1 == 1 & x2 == 2

R 包:dplyr

filter(data, x1 == 1 & x2 == 2)

filter() 会删除条件为 NA 的行,因此含缺失值的行不会被保留。

保留数据前几行

Stata

keep in 1/10

R 包:base

head(data, 10)

保留多个变量

Stata

keep x1 x3-x5

R 包:dplyr

select(data, x1, x3:x5)

也可以按位置选择:select(data, 1, 3:5)。select_or_transmute() 还可以同时计算新变量。

另有 6 个示例及替代实现

保留 x 未缺失行

Stata

keep if !missing(x)

R 包:dplyr

filter(data, !is.na(x))

保留取值在列表中的行

Stata

keep if inlist(x, 1, 3, 5)

R 包:dplyr

filter(data, x %in% c(1, 3, 5))

保留取值在某个范围内的行

Stata

keep if inrange(x, 5000, 10000)

R 包:dplyr

filter(data, between(x, 5000, 10000))

保留数据后几行

Stata

keep in -10/-1

R 包:base

tail(data, 10)

保留数据某几行

Stata

keep in 7/12

R 包:dplyr

slice(data, 7:12)

按通配符保留变量

Stata

keep x*

R 包:tidystata

select(data, varlist("x*"))

sample

抽取 10% 的随机样本,并确保可重复

Stata

set seed 2024; sample 10

R 包:tidystata

data |> slice_sample(prop = 0.1) |> set_seed(2024)

与 Stata 有差异 R 与 Stata 使用不同随机数流;相同数值种子不会复现相同随机数或抽样行。

抽取 1000 条个案的随机样本,并确保可重复

Stata

set seed 2024; sample 1000, count

R 包:tidystata

data |> slice_sample(n = 1000) |> set_seed(2024)

与 Stata 有差异 set_seed() 会在抽样之前设定种子,因此可以写在同一条管道中。 R 与 Stata 使用不同随机数流;相同数值种子不会复现相同随机数或抽样行。