使用R语言pivot_wider处理NHANES处方数据的行重复问题求助
解决NHANES处方药物数据的宽表转换问题
你的代码核心问题是列名来源选错了——用RXDUSE作为names_from会把"是否用药"拆成不同列,而不是按每个样本的药物顺序生成序号列,这才导致SEQN重复出现。
以下是正确的处理方案:
步骤说明
- 先把
RXDUSE转换成你期望的数字编码(Yes=1,No=2) - 按
SEQN分组,给每个样本下的药物编顺序号 - 用
pivot_wider把多行药物数据转成一行,用顺序号作为列名后缀,同时保留RXDUSE和RXDCOUNT(同一SEQN的这两个值是一致的,pivot_wider会自动合并) - 把空值替换成
.,符合你要的输出格式
完整代码
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
相关产品推荐
相关产品推荐

