如何基于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工具包完成转换,步骤如下:
- 加载工具包
library(tidyverse)
- 填充
NOME列的缺失值,确保每一行都对应正确的个体姓名
data_filled <- data %>% fill(NOME, .direction = "down")
- 按个体维度分组,给每个个体的记录添加序号(标记是第几条药物/信息条目)
data_with_id <- data_filled %>% group_by(AP, PROFISSIONAL, NOME) %>% mutate(record_id = row_number()) %>% ungroup()
- 将长格式转换为宽格式,批量处理所有需要转换的变量
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
相关产品推荐
相关产品推荐

