Как найти числа в кадре данных из списка? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть список, который выглядит примерно так. Каждый код уникально идентифицирует препарат:

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)

Я хочу изменить код человека, добавив столбец, в котором указывается, получает ли каждый человек (код) любой из препаратов из списка (код). Например, лицо 1 и лицо 3 будут идентифицированы как получающие препарат, но не лицо 2. Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Вы можете объединить свои данные и проверить, появляется ли лекарство. Например, с 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

0 голосов
/ 02 мая 2020

Вот альтернативный способ представления данных:

cbind(personcode, 
      as.data.frame(setNames(lapply(drugtest[[3]],`==`,personcode$drugcode), drugtest[[1]])))

#>   idcode gender drugcode Ibuprofen Paracetamol Aspirin
#> 1      1 female     5619      TRUE       FALSE   FALSE
#> 2      1 female     5802     FALSE       FALSE   FALSE
#> 3      2   male     4859     FALSE       FALSE   FALSE
#> 4      3   male     6803     FALSE       FALSE    TRUE
#> 5      3   male     4820     FALSE        TRUE   FALSE
#> 6      3   male     5428     FALSE       FALSE   FALSE
0 голосов
/ 02 мая 2020

Не уверен, как вы хотите, чтобы ваш ожидаемый результат выглядел, но вы можете использовать ave:

personcode$any_drug_received <- with(personcode, ave(drugcode %in% drugtest[[3]], 
                                                     idcode, FUN = any))
personcode

#  idcode gender drugcode any_drug_received
#1      1 female     5619              TRUE
#2      1 female     5802              TRUE
#3      2   male     4859             FALSE
#4      3   male     6803              TRUE
#5      3   male     4820              TRUE
#6      3   male     5428              TRUE

То же самое можно сделать с dplyr

library(dplyr)
personcode %>%
  group_by(idcode) %>%
  mutate(any_drug_received = any(drugcode %in% drugtest[[3]]))

и data.table

library(data.table)
setDT(personcode)[, any_drug_received := any(drugcode %in% drugtest[[3]]), idcode]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...