转换长、宽数据

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

reshape

宽数据到长数据

Stata

reshape long var, i(id) j(year)

R 包:tidyr

tidyr::pivot_longer(data, tidyselect::starts_with("var"), names_to = "year", names_prefix = "var", names_transform = list(year = as.integer), values_to = "var")

与 Stata 有差异 将数值后缀转换为整数year,对应未指定string的reshape long。 pivot_longer() 未设 names_transform 时返回文本 year,也不执行 reshape i()/j() 唯一性约束。

长数据到宽数据

Stata

reshape wide var, i(id) j(year)

R 包:tidyr

pivot_wider(data, names_from = year, values_from = var, names_prefix = "var")

与 Stata 有差异 重复键可使 pivot_wider() 生成列表列;Stata reshape wide 拒绝重复 i()/j() 组合。应先验证键。

另有 2 个示例及替代实现

使用基础 R 将重复测量转为长格式

Stata

reshape long var, i(id) j(year)

R 包:stats

stats::reshape(data, direction = "long", varying = list(c("var2000", "var2001")), v.names = "var", timevar = "year", times = c(2000, 2001), idvar = "id")

与 Stata 有差异 需要明确列出宽格式列和时间取值。本固定工作流程使用 var2000 和 var2001,请按实际数据修改列名。

使用基础 R 将重复测量转为宽格式

Stata

reshape wide var, i(id) j(year)

R 包:stats

stats::reshape(data, direction = "wide", v.names = "var", timevar = "year", idvar = "id", sep = "")

与 Stata 有差异 每个 id/year 组合需要恰有一行。R 的行顺序和属性可能与 Stata 不同,应按键和取值核对结果。

xpose

转置数据(很少用到)

Stata

xpose, clear

R 包:tibble

tibble::as_tibble(t(data), .name_repair = "unique")