如何用函数整合不同wave的多个dataframe并计算个体收入均值
函数化处理纵向数据集的收入均值计算
通用函数实现
下面是一个可批量处理多wave纵向数据的函数,自动完成文件读取、变量筛选、数据合并与均值计算:
library(tidyverse) library(haven) # 用于读取dta格式文件 calculate_income_mean <- function(file_paths, id_col = "ID", income_prefix = "income_wave_") { # 批量读取并处理每个wave的数据 wave_data_list <- map(file_paths, function(path) { df <- read_dta(path) # 自动匹配当前wave的收入变量 income_col <- grep(paste0("^", income_prefix), colnames(df), value = TRUE) df %>% select(all_of(c(id_col, income_col))) }) # 合并所有wave的数据 combined_df <- reduce(wave_data_list, full_join, by = id_col) # 计算每个ID的收入均值 final_df <- combined_df %>% mutate(average_income = rowMeans(select(., starts_with(income_prefix)), na.rm = TRUE)) %>% select(all_of(c(id_col, "average_income"))) return(final_df) }
参数说明
file_paths:包含所有wave数据文件路径的字符向量,示例:c("C:/User/all_waves/wave1.dta", "C:/User/all_waves/wave2.dta", "C:/User/all_waves/wave3.dta")id_col:标识研究对象的唯一ID列名,默认值为"ID"income_prefix:收入变量的前缀(如示例中的"income_wave_"),函数会自动匹配每个wave中以此前缀开头的收入列
使用示例
用测试数据验证
先将示例数据保存为临时dta文件(实际使用时直接替换为真实文件路径即可):
# 生成示例数据 wave_1 <- data.frame(ID=c(1, 2, 3, 4, 5, 6), income_wave_1=c(109, 106, 67, NA, 65, 190)) wave_2 <- data.frame(ID=c(1, 2, 3, 4, 5, 6), income_wave_2=c(NA, 120, 34, 76, 69, 160)) wave_3 <- data.frame(ID=c(1, 2, 3, 4, 5, 6), income_wave_3=c(34, 64, 78, NA, 170, 200)) # 保存为dta格式 write_dta(wave_1, "wave1.dta") write_dta(wave_2, "wave2.dta") write_dta(wave_3, "wave3.dta") # 调用函数计算均值 file_paths <- c("wave1.dta", "wave2.dta", "wave3.dta") result <- calculate_income_mean(file_paths) # 查看结果 print(result)
输出结果:
ID average_income 1 1 71.50000 2 2 96.66667 3 3 59.66667 4 4 76.00000 5 5 101.33333 6 6 183.33333
优势说明
- 无需手动逐个处理每个wave,新增wave时仅需在
file_paths中添加对应路径 - 自动匹配收入变量,避免手动指定每个wave的收入列名
- 基于tidyverse生态,代码简洁易读,便于后续扩展(如添加中位数、标准差等统计量)
内容的提问来源于stack exchange,提问作者Max Herre
相关产品推荐
相关产品推荐

