我认为这需要两个步骤:
- 组合文本字段以将单位添加到数字中。
-
dcast 两次,一次供参考,一次供所有患者使用。
数据表
library(data.table) # dcast
dat[, DE_VALOR_REFERENCIA := paste(DE_VALOR_REFERENCIA, CD_UNIDADE)] %>%
.[, DE_RESULTADO := paste(DE_RESULTADO, CD_UNIDADE) ] %>%
.[, CD_UNIDADE := NULL ]
dat[1:3,]
# ID_PACIENTE DE_ANALITO DE_RESULTADO DE_VALOR_REFERENCIA
# <char> <char> <char> <char>
# 1: XYZ Fosfatase Alcalina 106 U/L 40 - 129 U/L
# 2: XYZ Gama-GT 33 U/L 12 a 73 U/L
# 3: XYZ ALT (TGP) 51 U/L Até 41 U/L
rbindlist(list(
dat[, .(ID_PACIENTE = "DE_VALOR_REFERENCIA", DE_ANALITO, DE_VALOR_REFERENCIA)] %>%
dcast(., ID_PACIENTE ~ DE_ANALITO, value.var = "DE_VALOR_REFERENCIA"),
dat[, .(ID_PACIENTE, DE_ANALITO, DE_RESULTADO)] %>%
dcast(., ID_PACIENTE ~ DE_ANALITO, value.var = "DE_RESULTADO")
))
# ID_PACIENTE ALT (TGP) AST (TGO) DHL Dimeros D, quant Fibrinogenio Fosfatase Alcalina Gama-GT Hemoglobina Proteína C-Reativa
# <char> <char> <char> <char> <char> <char> <char> <char> <char> <char>
# 1: DE_VALOR_REFERENCIA Até 41 U/L Até 40 U/L 240 a 480 U/L Até 500 ng/mL 200 a 400 mg/dL 40 - 129 U/L 12 a 73 U/L 13,5 a 17,5 g/dL Ver resultado tradicional mg/dL
# 2: XYZ 51 U/L 35 U/L 530 U/L 256 ng/mL 578 mg/dL 106 U/L 33 U/L 13,3 g/dL 1,84 mg/dL
tidyverse
library(dplyr)
# library(tidyr) # pivot_wider
dat2 <- dat %>%
mutate(across(c(DE_VALOR_REFERENCIA, DE_RESULTADO), ~ paste(., CD_UNIDADE))) %>%
select(-CD_UNIDADE)
bind_rows(
tidyr::pivot_wider(transmute(dat2, ID_PACIENTE = "DE_VALOR_REFERENCIA", DE_ANALITO, DE_VALOR_REFERENCIA),
ID_PACIENTE, names_from = "DE_ANALITO", values_from = "DE_VALOR_REFERENCIA"),
tidyr::pivot_wider(select(dat2, ID_PACIENTE, DE_ANALITO, DE_VALOR_REFERENCIA),
ID_PACIENTE, names_from = "DE_ANALITO", values_from = "DE_VALOR_REFERENCIA")
)
数据
dat <- structure(list(ID_PACIENTE = c("XYZ ", "XYZ ", "XYZ ", "XYZ ", "XYZ ", "XYZ ", "XYZ ", "XYZ ", "XYZ "), DE_ANALITO = c("Fosfatase Alcalina ", "Gama-GT ", "ALT (TGP) ", "DHL ", "Proteína C-Reativa ", "AST (TGO) ", "Fibrinogenio ", "Dimeros D, quant ", "Hemoglobina "), DE_RESULTADO = c("106 ", "33 ", "51 ", "530 ", "1,84 ", "35 ", "578 ", "256 ", "13,3 "), CD_UNIDADE = c("U/L ", "U/L ", "U/L ", "U/L ", "mg/dL ", "U/L ", "mg/dL ", "ng/mL ", "g/dL "), DE_VALOR_REFERENCIA = c("40 - 129", "12 a 73", "Até 41", "240 a 480", "Ver resultado tradicional", "Até 40", "200 a 400", "Até 500", "13,5 a 17,5")), class = "data.frame", row.names = c(NA, -9L))
datout <- structure(list(ID_PACIENTE = c("DE_VALOR_REFERENCIA ", "XYZ "), Fosfatase.Alcalina = c("40 - 129 U/L ", "106 U/L "), Gama.GT = c("12 a 73 U/L ", "33 U/L "), ALT..TGP. = c("Até 41 U/L ", "51 U/L "), DHL = c("240 a 480 U/L ", "530 U/L "), `Proteína.C.Reativa` = c("Ver resultado tradicional mg/dL ", "1,84 mg/dL "), AST..TGO. = c("Até 40 U/L ", "35 U/L "), Fibrinogenio = c("200 a 400 mg/dL ", "578 mg/dL "), Dimeros.D..quant = c("Até 500 ng/mL ", "256 ng/mL "), Hemoglobina = c("13,5 a 17,5 g/dL", "13,3 g/dL")), class = "data.frame", row.names = c(NA, -2L))
setDT(dat)
setDT(datout)