如何在R中按ID聚合数据框,将Objekt.Nr.转为Fahrzeugart列?
解决方案
步骤1:填充缺失的ID值
原数据中ID列的NA属于前一个非NA的ID,需先填充这些缺失值:
library(tidyr) library(dplyr) # 向下填充ID列的缺失值 df_filled <- df %>% fill(ID, .direction = "down")
步骤2:透视数据并合并其他列
使用pivot_wider实现按ID分组,将每个Objekt.Nr.转换为对应的Fahrzeugart列,同时合并Col_1和Col_2的对应值:
df_wanted <- df_filled %>% # 按ID和对象编号分组,提取每组的车型值 group_by(ID, Objekt.Nr.) %>% summarize(Fahrzeugart = first(Fahrzeugart), .groups = "drop") %>% # 透视生成Fahrzeug_1至Fahrzeug_4列 pivot_wider( id_cols = ID, names_from = Objekt.Nr., values_from = Fahrzeugart, names_prefix = "Fahrzeug_" ) %>% # 合并每个ID对应的Col_1和Col_2非NA值(用列表存储,可替换为逗号分隔字符串) left_join( df_filled %>% group_by(ID) %>% summarize( Col_1 = list(na.omit(Col_1)), Col_2 = list(na.omit(Col_2)), .groups = "drop" ), by = "ID" )
关键说明
fill(ID, .direction = "down"):解决ID列缺失问题,确保每一行都归属到正确的ID分组。pivot_wider:核心透视逻辑,将对象编号转为列名前缀,车型值填充到对应列。- 若需要将
Col_1/Col_2转为逗号分隔的字符串,可替换list(na.omit(...))为stringr::str_c(na.omit(Col_1), collapse = ", ")。
原代码错误分析
你之前的代码存在两个问题:
melt操作未将Objekt.Nr.纳入id.vars,导致后续dcast无法关联对象编号与车型数据。- 未处理ID列的缺失值,无法实现正确的按ID分组透视。
内容的提问来源于stack exchange,提问作者MisterCoder
相关产品推荐
相关产品推荐

