【问题标题】:Issues with unmelting table in RR中未熔化表的问题
【发布时间】:2021-02-17 13:52:53
【问题描述】:

免责声明 - 我是一名生物学家,之前没有编码经验。

您好,我正在查看 Covid-19 患者血液参数的长格式数据集,我在尝试解开它时遇到了问题。这是数据集外观的一个小sn-p -

ID_PACIENTE DE_ANALITO DE_RESULTADO CD_UNIDADE DE_VALOR_REFERENCIA
XYZ Fosfatase Alcalina 106 U/L 40 - 129
XYZ Gama-GT 33 U/L 12 a 73
XYZ ALT (TGP) 51 U/L Até 41
XYZ DHL 530 U/L 240 a 480
XYZ Proteína C-Reativa 1,84 mg/dL Ver resultado tradicional
XYZ AST (TGO) 35 U/L Até 40
XYZ Fibrinogenio 578 mg/dL 200 a 400
XYZ Dimeros D, quant 256 ng/mL Até 500
XYZ Hemoglobina 13,3 g/dL 13,5 a 17,5

这就是我想要达到的目的-

ID_PACIENTE Fosfatase Alcalina Gama-GT ALT (TGP) DHL Proteína C-Reativa AST (TGO) Fibrinogenio Dimeros D, quant Hemoglobina
DE_VALOR_REFERENCIA 40 - 129 U/L 12 a 73 U/L Até 41 U/L 240 a 480 U/L Ver resultado tradicional mg/dL Até 40 U/L 200 a 400 mg/dL Até 500 ng/mL 13,5 a 17,5 g/dL
XYZ 106 U/L 33 U/L 51 U/L 530 U/L 1,84 mg/dL 35 U/L 578 mg/dL 256 ng/mL 13,3 g/dL

我尝试使用 dcast() 函数,但由于某种原因,我最终得到的是 1 和 0,而不是原始数据集中的值。

如何使用原始值获取宽格式数据集?

【问题讨论】:

  • 欢迎来到stackoverflow,阿里!请查看本网站上一些评价很高的问题,以了解应该如何格式化一个好的问题,以便更容易为您提供帮助。您需要以我们可以轻松访问以进行操作的形式提供您的数据,并提供您迄今为止尝试过的代码,以便我们可以修改您现有的代码,而不必从头开始。
  • 仅供参考,经过我的编辑(格式化为降价管道表),这两个都通过复制内容和read.table(header=T, 'clipboard', sep='\t') 导入到 R 中。
  • 阿里,这不仅仅是重塑:您正在组合字段。虽然这不是一项艰巨的任务,但您应该确保当您询问重塑时,所需要的只是重塑,而不是数据处理。谢谢。

标签: r dataframe dcast


【解决方案1】:

我认为这需要两个步骤:

  1. 组合文本字段以将单位添加到数字中。
  2. 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)

【讨论】:

  • 您好,谢谢您的回答。我运行了你的代码(第一个),在运行它的最后一行之后,我收到了这个错误 - .subset(x, j) 中的错误:无效的下标类型 'list'
  • 这意味着您的数据可能有些不同之处,您没有告诉我们(无论您是否知道)。 R 在控制台上呈现 data.frame 的方式可能与某些数据类型不明确,因此在 SO 上提供明确数据的唯一方法通常是以编程方式构建数据(例如,data.frame(...))或包含来自 @ 的输出987654328@,其中x 是您的数据的代表性样本,可能是顶部的这么多行。 (我认为dput 方式最适合您的情况。)
  • 你说得对,我只提供了整个数据集的一小部分,这是我从这个网站获得的 - repositoriodatasharingfapesp.uspdigital.usp.br/handle/item/97(这个链接到一个 .zip 文件,数据集是 /最终/HSL_Exames_2.csv)。如果你觉得很难访问它,我应该将它作为编辑添加到 OP 中吗?
  • 我想你会发现很多人选择不点击这样无法识别的外部链接。真的,除非数据需要很大,否则只需按照我的建议使用dput
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多