【问题标题】:How do I assign more than 2 numerical categories in R to single response?如何将 R 中的 2 个以上数字类别分配给单个响应?
【发布时间】:2021-08-03 10:05:29
【问题描述】:

我对 R 很陌生。我有一个医院数据集,其中根据诊断为患者分配类别。例如

  • 患者#:疾病分类
  • 1:dis A/dis C
  • 2:dis B
  • 3:dis A/dis B/dis C

以此类推,总共有 8 种疾病。这里的“/”表示存在一种以上的疾病。我想对它们进行数字分类,使 dis A=1、dis B=2 等等。以上数据需为:

  • 患者#:疾病分类
  • 1:1/3
  • 2:2
  • 3: 1/2/3

我已经用 sapply 尝试过,作为水平的一个因素,但我能得到的最好的结果是正确的分类,只有一种疾病。组合疾病返回 NULL 值。有没有办法做到这一点?请帮忙!

这是一个示例:

structure(list(Classification = c("IHD/other/cardiopulmonary", 
"IHD", "hypertensive", "IHD/other", "IHD/other", "IHD/other/CVA"
), Comorbidities = c("DM", "HT+DM", "HT+DM", NA, NA, "HT+DM"), 
    Diagnosis = c("CORONARY ARTERY DISEASE WITH MITRAL REGURGITATION WITH TRICUSPID REGURGITATION WITH PULOMNARY HYPERTENSION WITH DYSFUNCTION LEFT VENTRICLE WITH DIABETES MELLITUS", 
    "ACUTE CORONARY SYNDROME WITH ANTERIOR WALL MYOCARDIAL INFARCTION WITH CARDIOGENIC SHOCK WITH BLEEDING DIATHESIS WITH DIABETES MELLITUS WITH HYPERTENSION", 
    "ASPIRATION PNEUMONTIS WITH RESPIRATORY FALIURE WITH HYPERTENSION WITH HYPONATERMIA WITH DIABETES MELLITUS", 
    "ACUTE CORONARY SYNDROME WITH RIGHT BUNDLE BRANCH BLOCK WITH ANTERIOR WALL MYOCARDIAL INFARCTION WITH CARDIOGENIC SHOCK", 
    "COMPLETE HEART BLOCK WITH CARDIAC ARREST WITH INTERIOR WALL MYOCARDIAL INFARCTION", 
    "DIABETES MELLITUS WITH CORONARY ARTERY DISEASE WITH HYPERTENSION SYSTEMIC WITH ATRIAL FIBRILATION WITH PULMONARY TUBERCULOSIS WITH CEREBRO VASCULAR ACCIDENT WITH CARDIOGENIC SHOCK"
    )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 我尝试使用之前给出的汽车解决方案(我现在看不到它)但遇到了同样的问题
  • 你能展示一个示例数据集吗?最好使用dput(head(YOURDATA)) 。这样可以更轻松地构建合适的答案并对其进行测试。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 添加为编辑
  • @user16584364 我删除了car 解决方案,因为我发现它不起作用。现在我用您的示例更新了我的解决方案。

标签: r categories numeric levels


【解决方案1】:

这是一个基本的 R 选项,它适用于任意数量的疾病,而无需手动指定它们的数字。

#split the string on '/'
split_vals <- strsplit(df$Classification, '/')
#Get the unique values
all_vals <- unique(unlist(split_vals))
#Use match to get a unique number for each value.
df$Classification <- sapply(split_vals, function(x) 
                            paste(match(x, all_vals),collapse = '/'))
df

# Classification Comorbidities Diagnosis                                                                 
#  <chr>          <chr>         <chr>                                                                     
#1 1/2/3          DM            CORONARY ARTERY DISEASE WITH MITRAL REGURGITATION WITH TRICUSPID REGURGIT…
#2 1              HT+DM         ACUTE CORONARY SYNDROME WITH ANTERIOR WALL MYOCARDIAL INFARCTION WITH CAR…
#3 4              HT+DM         ASPIRATION PNEUMONTIS WITH RESPIRATORY FALIURE WITH HYPERTENSION WITH HYP…
#4 1/2            NA            ACUTE CORONARY SYNDROME WITH RIGHT BUNDLE BRANCH BLOCK WITH ANTERIOR WALL…
#5 1/2            NA            COMPLETE HEART BLOCK WITH CARDIAC ARREST WITH INTERIOR WALL MYOCARDIAL IN…
#6 1/2/5          HT+DM         DIABETES MELLITUS WITH CORONARY ARTERY DISEASE WITH HYPERTENSION SYSTEMIC…

【讨论】:

  • 函数match的大用处。
  • 好的,所以这部分工作,它给了我 11 种不同的数值。例如,IHD=1, IHD/OTHER=1/2 但 OTHER 本身是 8 而不是 2。我将分类更改为全部大写以避免进一步混淆。有什么办法吗?
  • 数据中可能有一些空格。使用all_vals &lt;- trimws(unique(unlist(split_vals))) 并在match(x...) 中使用match(trimws(x), ...) 代替x
  • 终于成功了,我回到excel中的原始数据并在那里将其全部更改为大写,然后重新导入到r。修复了问题。感谢您的解决方案!
【解决方案2】:

带有mgsub 的简单子集来自qdap

dis <- c('dis A','dis B','dis C','dis D','dis E','dis F','dis G','dis H')
class <- 1:8

library(dplyr)
library(qdap)

dt %>% 
  mutate(`Disease classification` = mgsub(dis,class,`Disease classification`))

# dt %>% 
#   mutate(`NEW Disease classification` = mgsub(dis,class,`Disease classification`))

【讨论】:

  • 我加载了两个包,但收到“找不到 mgsub”错误。
  • 我已经这样做了,图书馆(qdap)也是如此。还尝试重新启动 R 会话
  • 如果加载库后出现“could not find mgsub”,说明安装不正确
【解决方案3】:

有效:

stringr::str_replace_all(string = c("1 dis A/dis C 2 dis B 3 dis A/dis B/dis C", "dis A/dis B"), pattern = c('dis A' = '1', 'dis B' = '2','dis C' = '3'))
[1] "1 1/3 2 2 3 1/2/3" "1/2"    

更新

使用示例数据:

stringr::str_replace_all(string = df$Classification, pattern = c('IHD' = '1', 'other' = '2','cardiopulmonary' = '3', 'hypertensive' = '4', 'CVA'='5'))
[1] "1/2/3" "1"     "4"     "1/2"   "1/2"   "1/2/5"

因此,为了更新您的数据,您可以这样做:

df$Classification <- stringr::str_replace_all(string = df$Classification, pattern = c('IHD' = '1', 'other' = '2','cardiopulmonary' = '3', 'hypertensive' = '4', 'CVA'='5'))

【讨论】:

  • 在 stri_replace_all_regex(string, pattern, fix_replacement(replacement), : 参数不是原子向量;强制。-这是我得到的错误,然后结果只是列中的大量随机数
  • @user16584364 我没有收到任何警告或错误; class(df$Classification) 对你来说是什么?
猜你喜欢
  • 1970-01-01
  • 2012-11-10
  • 2015-05-20
  • 1970-01-01
  • 2022-11-14
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多