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

无列表与空值的R数据框长转宽问题(续问)

解决方法

核心思路是按PK和就诊编号(visit)分组,合并同一就诊下的多行数据,保留各检查项的非空值,直接用dplyr的分组聚合就能搞定,不用绕转长转宽的弯路:

代码实现

library(dplyr)

# 假设你的原始数据框名为original_df
target_df <- original_df %>%
  # 过滤掉无就诊编号的行(visit为NA的记录)
  filter(!is.na(visit)) %>%
  # 按PK和就诊编号分组
  group_by(PK, visit) %>%
  # 提取每个检查列的唯一非NA值;如果全是NA则返回NA
  summarise(
    toddler = first(na.omit(toddler)),
    module1 = first(na.omit(module1)),
    rbs = first(na.omit(rbs)),
    srs = first(na.omit(srs)),
    adi_score = first(na.omit(adi_score)),
    .groups = "drop"  # 取消分组
  )

代码说明

  1. 过滤无效行:先去掉visit为NA的记录,这些是未编排就诊的检查项,目标结果不需要;
  2. 分组聚合:按PK和visit分组后,每个组对应一次就诊的所有记录;
  3. 提取有效数据:na.omit()会去掉列中的NA值,first()取剩下的唯一有效数据(同一就诊下每个检查项只会有一个有效记录),如果全是NA则返回NA,完美匹配目标格式。

为什么之前的方法出问题?

你之前尝试转长再转宽时,因为同一就诊下的多行数据会生成重复的检查项条目,导致转宽时无法唯一识别每个单元格的值,所以出现列表列和警告。直接分组聚合更贴合你的数据逻辑——同一就诊下每个检查项最多一个有效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:42:10