首页 > 解决方案 > 如何从列表中找到数据框中的数字?

问题描述

我有一个看起来有点像这样的列表。每个代码唯一标识药物:

drugname <- c('Ibuprofen','Paracetamol','Aspirin')
dose <- c(50, 70, 40)
code <- c(5619, 4820, 6803)
drugtest <- list(drugname, dose, code)

我还有一个数据框,其中包含由 idcode 唯一标识的人的信息。每行都包含有关这些人使用的不同药物的信息。这些药物由与列表中的代码列对应的药物代码标识。

personcode <- 
matrix(c(1,'female',5619,1,'female',5802,2,'male',4859,3,'male',6803,3,'male',4820, 
3,'male',5428),ncol=3,byrow=TRUE)
colnames(personcode) <- c("idcode","gender","drugcode")
rownames(personcode) <- c("1","2","3","4","5","6")
personcode <- data.frame(personcode)

我想改变人员代码,添加一个列来标识每个人(idcode)是否从列表(代码)中接收任何一种药物。例如,第 1 个人和第 3 个人将被识别为正在接受药物,但不是第 2 个人。我该怎么做?

标签: rdplyr

解决方案


您可以合并数据框并检查是否出现药物。例如data.table

library(data.table)
drugtest <- data.table(drugname, dose, code)
setDT(personcode)

personcode2 <- merge(personcode, drugtest, all.x = TRUE, by.x = "drugcode", by.y = "code")
personcode2
  drugcode idcode gender    drugname dose
1     4820      3   male Paracetamol   70
2     4859      2   male        <NA>   NA
3     5428      3   male        <NA>   NA
4     5619      1 female   Ibuprofen   50
5     5802      1 female        <NA>   NA
6     6803      3   male     Aspirin   40

并获取哪些人接受了药物:

personcode2[,.('drug' = sum(!is.na(drugname))>1), by = 'idcode']
   idcode  drug
1:      3  TRUE
2:      2 FALSE
3:      1 FALSE


推荐阅读