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

使用R语言pivot_wider处理NHANES处方数据的行重复问题求助

解决NHANES处方药物数据的宽表转换问题

你的代码核心问题是列名来源选错了——用RXDUSE作为names_from会把"是否用药"拆成不同列,而不是按每个样本的药物顺序生成序号列,这才导致SEQN重复出现。

以下是正确的处理方案:

步骤说明

  1. 先把RXDUSE转换成你期望的数字编码(Yes=1,No=2)
  2. 按SEQN分组,给每个样本下的药物编顺序号
  3. 用pivot_wider把多行药物数据转成一行,用顺序号作为列名后缀,同时保留RXDUSE和RXDCOUNT(同一SEQN的这两个值是一致的,pivot_wider会自动合并)
  4. 把空值替换成.,符合你要的输出格式

完整代码

library(dplyr)
library(tidyr)

staxpiv <- stax2 %>%
  # 转换RXDUSE为数字编码
  mutate(RXDUSE = case_when(
    RXDUSE == "Yes" ~ 1,
    RXDUSE == "No" ~ 2,
    TRUE ~ NA_real_
  )) %>%
  # 按样本编号分组,生成药物顺序号
  group_by(SEQN) %>%
  mutate(drug_id = 1:n()) %>%
  ungroup() %>%
  # 转宽表:保留核心字段,药物列按顺序命名
  pivot_wider(
    id_cols = c(SEQN, RXDUSE, RXDCOUNT),
    values_from = RXDDRGID,
    names_from = drug_id,
    names_prefix = "rxddrgid_",
    values_fill = "."  # 空值用.填充
  ) %>%
  # 列名转小写(匹配你期望的输出格式)
  rename_all(tolower)

处理后结果示例

运行代码后,你的示例数据会输出如下格式(每个SEQN仅出现一行):

seqn rxduse rxdcount rxddrgid_1 rxddrgid_2 rxddrgid_3
  93703      2       NA .          .          .         
  93704      2       NA .          .          .         
  93705      1        3 d03740     d04532     d00325    
  93706      2       NA .          .          .         
  93707      2       NA .          .          .         
  93708      1        3 d00689     d03821     d00746    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:43:10