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

如何基于NOME列的NA值将多行转换为对应个体的多列?

问题描述

现有如下R数据框:

data <- data.frame(AP = c("1.0", "1.0", "1.0", "2.2", "2.2", "3.1", "3.1", "3.1", "3.1", "3.1"),
                   PROFISSIONAL = c("JULIA", "JULIA", "JULIA", "ROSANA", "ROSANA", "JEFERSON", "JEFERSON", "JEFERSON", "JEFERSON", "JEFERSON"),
                   NOME = c("MARIA A", NA, NA, "RENATA", NA, "CLAUDIA", NA, NA, NA, NA),
                   MEDICAMENTO = c("LOSARTANA", "PARACETAMOL", "NEOSORO", "LOSARTANA", "ATENOLOL", "SINVASTATINA", "AAS", "ENALAPRIL", "HIDROCLOROTIAZIDA", "FLUOXETINA"))

其中NOME列的NA属于其上方最近的非NA姓名(比如CLAUDIA后的4个NA都对应CLAUDIA)。需要将这种多行记录转换为每个个体一行的宽格式,期望输出如下:

data2 <- data.frame(AP = c("1.0", "2.2", "3.1"),
                   PROFISSIONAL = c("JULIA", "ROSANA", "JEFERSON"),
                   NOME = c("MARIA A", "RENATA", "CLAUDIA"),
                   MEDICAMENTO1 = c("LOSARTANA", "LOSARTANA", "SINVASTATINA"),
                   MEDICAMENTO2 = c("PARACETAMOL", "ATENOLOL", "AAS"),
                   MEDICAMENTO3 = c("NEOSORO", NA, "ENALAPRIL"),
                   MEDICAMENTO4 = c(NA, NA,  "HIDROCLOROTIAZIDA"),
                   MEDICAMENTO5 = c(NA, NA,  "FLUOXETINA"))

补充说明:除MEDICAMENTO外,数据框还包含DIF、STATUS、STATUS2、INDICAÇÃO、STATUS9、DOSE1、DOSE2、FREQ1、FREQ2、DOSEREAL1和DOSEREAL2变量;AP和PROFISSIONAL可对应多个不同NOME。

解决方案

可以用tidyverse工具包完成转换,步骤如下:

  1. 加载工具包
library(tidyverse)
  1. 填充NOME列的缺失值,确保每一行都对应正确的个体姓名
data_filled <- data %>%
  fill(NOME, .direction = "down")
  1. 按个体维度分组,给每个个体的记录添加序号(标记是第几条药物/信息条目)
data_with_id <- data_filled %>%
  group_by(AP, PROFISSIONAL, NOME) %>%
  mutate(record_id = row_number()) %>%
  ungroup()
  1. 将长格式转换为宽格式,批量处理所有需要转换的变量
data_wide <- data_with_id %>%
  pivot_wider(
    id_cols = c(AP, PROFISSIONAL, NOME),
    names_from = record_id,
    names_glue = "{.value}_{record_id}",
    values_from = c(MEDICAMENTO, DIF, STATUS, STATUS2, `INDICAÇÃO`, STATUS9, DOSE1, DOSE2, FREQ1, FREQ2, DOSEREAL1, DOSEREAL2)
  )

转换后,每个变量会生成如MEDICAMENTO_1、MEDICAMENTO_2,DOSE1_1、DOSE1_2格式的列,对应个体的第n条记录。如果想要和示例一致的MEDICAMENTO1格式,可将names_glue改为"{.value}{record_id}"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:00:36