如何基于年度季度工资数据生成二元变量Binary2?
生成Binary2变量的解决方案
要生成符合要求的Binary2变量,核心是按个人(MPI)+年份分组,判断该组内所有季度工资是否都≥100美元,再把判断结果统一赋值给组内每一行。下面是几种R语言实现方法:
方法1:使用dplyr包(tidyverse生态)
适合习惯tidy风格的用户,代码可读性强:
# 加载dplyr包 library(dplyr) # 读取示例数据 dd <- read.table(text=" MPI yrqtr Wage Binary Binary2 PersonA 20101 100 1 1 PersonA 20102 100 1 1 PersonA 20103 100 1 1 PersonA 20104 100 1 1 PersonA 20111 100 1 0 PersonA 20112 100 1 0 PersonA 20113 100 1 0 PersonA 20114 50 0 0", header=T) # 生成Binary2 dd <- dd %>% # 从yrqtr字段提取年份(取前4位字符) mutate(year = substr(as.character(yrqtr), 1, 4)) %>% # 按个人和年份分组 group_by(MPI, year) %>% # 组内所有工资都≥100则标记为1,否则为0 mutate(Binary2 = as.integer(all(Wage >= 100))) %>% # 取消分组并移除临时year列(可选) ungroup() %>% select(-year)
方法2:使用data.table包(高效处理大数据)
如果数据集规模较大,data.table的运算效率更高:
# 加载data.table包 library(data.table) # 将数据转换为data.table格式 setDT(dd) # 提取年份并生成Binary2 dd[, year := substr(as.character(yrqtr), 1, 4)] dd[, Binary2 := as.integer(all(Wage >= 100)), by = .(MPI, year)] dd[, year := NULL] # 删除临时年份列
方法3:Base R(无需额外安装包)
不想安装第三方包的话,用Base R的ave函数也能实现:
# 读取示例数据 dd <- read.table(text=" MPI yrqtr Wage Binary Binary2 PersonA 20101 100 1 1 PersonA 20102 100 1 1 PersonA 20103 100 1 1 PersonA 20104 100 1 1 PersonA 20111 100 1 0 PersonA 20112 100 1 0 PersonA 20113 100 1 0 PersonA 20114 50 0 0", header=T) # 提取年份 dd$year <- substr(as.character(dd$yrqtr), 1, 4) # 按个人和年份分组,判断所有工资是否达标,再转成1/0格式 dd$Binary2 <- as.integer(with(dd, ave(Wage >= 100, MPI, year, FUN = all))) # 移除临时year列 dd$year <- NULL
内容的提问来源于stack exchange,提问作者Connor Hill
相关产品推荐
相关产品推荐

