R语言实现匹配变量按逆时序合并同行功能求助
解决方案
先确保你安装并加载了dplyr和tidyr这两个常用数据处理包,新手用这个组合上手快:
install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr)
先模拟你的数据结构
假设你的数据框叫var_info,结构大概是这样(你可以替换成自己的实际列名):
var_info <- data.frame( Variable_Name = c("age", "gender", "age", "income", "gender"), Category_Count = c(80, 2, 90, 10, 2), Format = c("%d", "%s", "%d", "%d", "%s"), Label = c("年龄", "性别", "年龄(新版)", "收入", "性别"), Survey_Year = c(2018, 2020, 2022, 2020, 2018) )
编写目标函数
这个函数接收两个参数:你的数据框df,以及要匹配合并的变量名向量target_vars:
merge_vars_by_year <- function(df, target_vars) { # 处理需要合并的目标变量 merged_part <- df %>% filter(Variable_Name %in% target_vars) %>% group_by(Variable_Name) %>% # 按调查年份逆序排序,最新的排在前面 arrange(desc(Survey_Year), .by_group = TRUE) %>% # 给每组内的行加序号,从1开始 mutate(row_num = row_number()) %>% ungroup() %>% # 转成宽格式,生成带序号的列名 pivot_wider( names_from = row_num, values_from = c(Variable_Name, Category_Count, Format, Label, Survey_Year), names_glue = "{.value}_{row_num}" ) # 处理不需要合并的变量(未匹配的) unmerged_part <- df %>% filter(!Variable_Name %in% target_vars) # 合并两部分,自动对齐列,缺失值补NA bind_rows(merged_part, unmerged_part) }
测试函数
比如你要合并age和gender这两个变量:
result <- merge_vars_by_year(var_info, target_vars = c("age", "gender")) print(result)
运行后你会看到:
age的两条记录按2022、2018逆序合并成一行,列名变成Variable_Name_1(值为age)、Survey_Year_1(2022)、Variable_Name_2(age)、Survey_Year_2(2018)等gender的两条记录按2020、2018逆序合并成一行income因为不在目标变量里,保持单独一行
注意事项
- 如果你的实际列名和示例不一样,要把函数里的
Variable_Name、Survey_Year等替换成你数据里的真实列名 - 如果同一个变量在同一年有多个记录,函数会按原顺序保留,你可以在
arrange里加更多排序条件调整
内容的提问来源于stack exchange,提问作者astrori
相关产品推荐
相关产品推荐

