прокручивать список, чтобы сопоставить значение с несколькими возможными совпадениями - PullRequest
0 голосов
/ 25 ноября 2018

Я заинтересован в циклическом просмотре списка кодов диагноза и заполнении новой переменной предварительно рассчитанным показателем риска, если это значение совпадает, и, если имеется несколько совпадений, заполняет новую переменную с самым высоким показателем риска.

Я надеюсь взять длинную форму исходного набора данных и для каждого идентификатора сопоставить номер процедуры с наивысшей оценкой риска и сохранить как номер процедуры, так и оценку риска в отдельных переменных.

У меня есть некоторый опыт использования циклов if для аналогичных операций с широкими данными, но я не могу понять, как это сделать таким образом.У меня нет опыта сопоставления и последующего сохранения наибольшего значения, поэтому даже не знаю, с чего начать.

Данные, чтобы увидеть, к чему я стремлюсь:

Вот данные издля диагностических кодов

dz <-c("disease_1", "disease_2", "disease_3", "disease_4")
code <-c(124, 546, 890, 898)
risk_score <-c(10, 122, 45, 98)
df <-data.frame(dz, code, risk_score)

и имитируемого набора данных, который меня интересует

 id <- c(1,1,1,2,2,2,2,3,3,4,4,4,4,4,4,5,5,5)
 proc <-c(244,546,234,345,890,123,434,634,233,345,124,234,634,546,789,890,567,124)
 proc<-as.character(proc)
 data<-data.frame(id, proc)

, поэтому я хочу добиться чего-то вроде этого

id<-c(1,2,3,4,5)
code_match<-c(546,890,124,546,890)
highest_risk_score <-c(122,45,10,122,45)
output_df<-data.frame(id, code_match, highest_risk_score)

с этим выводом

  id code_match highest_risk_score
1  1        546                122
2  2        890                 45
3  3        124                 10
4  4        546                122
5  5        890                 45

с id, являющимся идентификатором, code_match - это код с наивысшей оценкой риска, а на самый высокий_risk_score - значение оценки риска (наибольшее значение для этого идентификатора).

1 Ответ

0 голосов
/ 26 ноября 2018

Мы будем использовать альтернативный способ создания этих фреймов данных:

data.frame(
  dz = c("disease_1", "disease_2", "disease_3", "disease_4"),
  code = as.character(c(124, 546, 890, 898)),
  risk_score = c(10, 122, 45, 98),
  stringsAsFactors = FALSE
) -> df

data.frame(
  id = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5),
  proc = as.character(c(244, 546, 234, 345, 890, 123, 434, 634, 233, 345, 124, 234, 634, 546, 789, 890, 567, 124)),
  stringsAsFactors = FALSE
) -> data

Вот один из способов (в tidyverse и base R) сделать это:

57 скомпилировано ?зависимость tidyverse решение:

library(tidyverse)

filter(data, proc %in% df$code) %>%
  left_join(df, by=c("proc"="code")) %>%
  group_by(id) %>%
  top_n(1) %>%
  slice(1) %>%
  select(id, code_match = proc, highest_risk_score = risk_score)
## # A tibble: 4 x 3
## # Groups:   id [4]
##      id code_match highest_risk_score
##   <dbl> <chr>                   <dbl>
## 1    1. 546                      122.
## 2    2. 890                       45.
## 3    4. 546                      122.
## 4    5. 890                       45.

0 ok (хорошо, 1 - stats - что подходит для поездки с базой R) Решение Base R

tmp <- merge(data[with(data, proc %in% df$code),], df, by.x = "proc", by.y = "code")

do.call(
  rbind.data.frame,
  lapply(
    split(tmp, tmp$id),
    function(x) {
      x[which.max(x$risk_score),]
    }
  )
)[,-3] -> tmp

setNames(tmp[,c(2,1,3)], c("id", "code_match", "highest_risk_score"))
##   id code_match highest_risk_score
## 1  1        546                122
## 2  2        890                 45
## 4  4        546                122
## 5  5        890                 45

Вы 'Мы не упоминали, как обрабатывать несоответствия, поэтому они просто игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...