无列表与空值的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" # 取消分组 )
代码说明
- 过滤无效行:先去掉
visit为NA的记录,这些是未编排就诊的检查项,目标结果不需要; - 分组聚合:按
PK和visit分组后,每个组对应一次就诊的所有记录; - 提取有效数据:
na.omit()会去掉列中的NA值,first()取剩下的唯一有效数据(同一就诊下每个检查项只会有一个有效记录),如果全是NA则返回NA,完美匹配目标格式。
为什么之前的方法出问题?
你之前尝试转长再转宽时,因为同一就诊下的多行数据会生成重复的检查项条目,导致转宽时无法唯一识别每个单元格的值,所以出现列表列和警告。直接分组聚合更贴合你的数据逻辑——同一就诊下每个检查项最多一个有效数据。
内容的提问来源于stack exchange,提问作者Gal Or
相关产品推荐
相关产品推荐

