在R中按ID整合多行列数据,生成季度所属企业列
处理R语言多观测人员雇佣数据的季度企业匹配与行整合
我们有一个包含人员雇佣记录的data.frame,每个人员(id)可能对应多行观测。其中quarter_1至quarter_4为季度雇佣状态虚拟变量(1表示该季度受雇于对应firm,0则相反)。需要完成以下操作:
- 创建4个新列
firm_q_1至firm_q_4,分别记录每个id对应季度的受雇企业,无受雇记录则设为NA - 将同一
id的信息整合至一行,方便后续转换为面板数据
原始数据示例
df <- structure(list(id = c(1L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 7L, 8L, 8L, 8L), firm = c(111L, 222L, 111L, 333L, 444L, 111L, 444L, 555L, 999L, 12L, 13L, 14L), quarter_1 = c(0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L), quarter_2 = c(0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L), quarter_3 = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L), quarter_4 = c(1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -12L))
解决方案
使用dplyr包可以高效完成数据处理,核心逻辑是按id分组后,提取每个季度对应受雇企业并填充到所有行,最后去重得到每个id的唯一记录:
library(dplyr) # 生成季度企业匹配列并整合行 df_processed <- df %>% group_by(id) %>% mutate( firm_q_1 = ifelse(any(quarter_1 == 1), firm[quarter_1 == 1], NA_integer_), firm_q_2 = ifelse(any(quarter_2 == 1), firm[quarter_2 == 1], NA_integer_), firm_q_3 = ifelse(any(quarter_3 == 1), firm[quarter_3 == 1], NA_integer_), firm_q_4 = ifelse(any(quarter_4 == 1), firm[quarter_4 == 1], NA_integer_) ) %>% ungroup() %>% # 去重保留每个id的唯一行 distinct(id, .keep_all = TRUE)
若需保留原始多行结构(如用户给出的预期输出示例),只需去掉最后一行
distinct(id, .keep_all = TRUE),此时每个id的多行记录会自动填充对应季度企业值,无匹配的行对应列设为NA。
处理后的数据示例
structure(list(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L), firm = c(111L, 111L, 333L, 444L, 111L, 444L, 555L, 12L), quarter_1 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L), quarter_2 = c(0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L), quarter_3 = c(1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L), quarter_4 = c(1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L), firm_q_1 = c(222L, NA, 333L, 444L, 111L, NA, 999L, 13L), firm_q_2 = c(222L, NA, NA, 444L, 111L, NA, 555L, 12L), firm_q_3 = c(111L, 111L, NA, 444L, 111L, 444L, NA, 12L), firm_q_4 = c(111L, NA, NA, NA, 111L, 444L, NA, 14L)), class = "data.frame", row.names = c(NA, -8L))
内容的提问来源于stack exchange,提问作者R novice
相关产品推荐
相关产品推荐

