Определите значения в нескольких столбцах и заполните новый столбец на основе результата - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть только немного базового опыта R.Я работаю с большим набором медицинских данных.Существует 15 столбцов с кодами процедур (PR #) и еще 15 соответствующих столбцов для времени этих процедур (PRDAYS #), в каждой строке один пациент.То, что я хотел бы сделать, это пройти через 15 столбцов процедур и определить 6 конкретных кодов, которые у меня есть.Я хочу сгенерировать новую двоичную переменную для каждого конкретного пациента, если у них есть хотя бы один из 6 кодов в любом из 15 столбцов PR #, тогда новая переменная равна 0. Затем я хочу сгенерировать вторую переменную, которая принимаетсоответствующее время процедуры этой переменной.Например, скажем, интересующий меня код - S55.Пациент с PR1, равным S55, и PRDAYS1, равным 2, будут иметь новую переменную PR_bin, равную 1, и PR_time, равную 2. Пациент, не имеющий S55 в своих номерах PR, приведет к PR_bin, равному 0, и PR_time, равному NA.

Надеюсь, это имеет смысл!Абсолютно новый для stackoverflow.

Спасибо!

Редактировать: пример кода.Для простоты я включил только 3 процедуры (с 3 раза).Допустим, меня интересуют S55 и S25.Если оба существуют (строка 2), я хочу более короткое время из двух, перечисленных в PR_time.Если ни того, ни другого, PR_time должно быть NA.

       PR1 PR2 PR3 PRDAYS1 PRDAYS2 PRDAYS3 PR_bin PR_time
    1  S55 S03 S01    1       2       1      1      1
    2  S23 S55 S25    1       2       1      1      1 
    3  S02 S03 S05    1       8       2      0      NA
    4  S55 S02 S05    6       5       3      1      6      
    5  S25 S52 S22    3       7       2      1      3

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Если мы можем предположить, что столбцы всегда находятся в одном и том же, логическом порядке, мы можем сделать это короче:

interest <- c('S25', 'S55')
data$PR_time <- sapply(1:nrow(data), function(i) {
  min(ifelse(data[i,1:3] %in% interest,
             unlist(data[i,4:6]),
             999))
})
data$PR_time[data$PR_time==999] <- NA
data$PR_bin <- !is.na(data$PR_time)
# Or to set to 0/1:
data$PR_bin <- ifelse(!is.na(data$PR_time), 1, 0)

Это решает для вашего примера, но вы можете легко настроить для большего количества столбцов.

Функция sapply выглядит пугающе, но если вы больше работаете с R, она оказывается очень полезной.Он применяет функцию к различным значениям, в данном случае самописной функции, для каждой строки.Результат похож на цикл for, но он не должен происходить последовательно.

Реальная работа выполняется с помощью ifelse для сопоставления длительностей операций с условием: интересующая операциянам.Итак, для первой строки мы посмотрим, какие значения представляют интерес, что дает нам TRUE, FALSE, FALSE.Для TRUE мы берем значение из следующего аргумента, для FALSE s мы смотрим на аргумент после этого.И, наконец, мы объединяем, поэтому мы получаем 1, 999, 999.Минимум из них равен 1. Вот что мы храним.

Конечным результатом является список самых коротких операций, или 999, если их нет.

Наконец, мы его очищаем: устанавливаем значенияот 999 до NA, и теперь легко установить PR_bin

0 голосов
/ 10 декабря 2018

Я думаю, это то, что вы ищете:

# creating a version of your data
PR1 = paste0("S", round(runif(length(PR),40,80)))
PR2 = paste0("S", round(runif(length(PR),40,80)))
PR3 = paste0("S", round(runif(length(PR),40,80)))
PR4 = paste0("S", round(runif(length(PR),40,80)))
PR5 = paste0("S", round(runif(length(PR),40,80)))
PR6 = paste0("S", round(runif(length(PR),40,80)))
PR7 = paste0("S", round(runif(length(PR),40,80)))
PR8 = paste0("S", round(runif(length(PR),40,80)))
PR9 = paste0("S", round(runif(length(PR),40,80)))
PR10 = paste0("S", round(runif(length(PR),40,80)))
PR11 = paste0("S", round(runif(length(PR),40,80)))
PR12 = paste0("S", round(runif(length(PR),40,80)))
PR13 = paste0("S", round(runif(length(PR),40,80)))
PR14 = paste0("S", round(runif(length(PR),40,80)))
PR15 = paste0("S", round(runif(length(PR),40,80)))
PatientID = paste0("PID", seq(1,length(PR1),1))
PRDAYS1 = round(runif(length(PR),1,10))

# turn all of the arrays into a data frame 
data <- data.frame(PatientID, PR1, PR2, PR3, PR4, PR5,
                   PR6, PR7, PR8, PR9, PR10, PR11, PR12,
                   PR13, PR14, PR15, PRDAYS1, stringsAsFactors = F)

# your 6 procedure codes you are looking for
Procedures.of.interest = c("S55", "S50", "S42", "S60", "S59", "S52")

# make sure you have tidyverse installed - if you havent install.packages("tidyverse")
require(tidyverse)

# search all of the columns for your procedures 
data <- data %>% group_by(PatientID) %>%
  mutate(PR_bin = T %in% (Procedures.of.interest %in% c(PR1, PR2, PR3, PR4, PR5,
                                               PR6, PR7, PR8, PR9, PR10, PR11, PR12,
                                               PR13, PR14, PR15)))

# convert the trues to 1 and falses to 0
data$PR_bin <- ifelse(data$PR_bin == T, 1, 0)

# add the PR days if PR_bin was 1 otherwise add NA
data$PR_time <- ifelse(data$PR_bin == 1, data$PRDAYS1, NA)

# view the new data 
View(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...