You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 = ", ")。

原代码错误分析

你之前的代码存在两个问题:

  1. melt操作未将Objekt.Nr.纳入id.vars,导致后续dcast无法关联对象编号与车型数据。
  2. 未处理ID列的缺失值,无法实现正确的按ID分组透视。

内容的提问来源于stack exchange,提问作者MisterCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:15:59