проверить, равны ли значения в нескольких столбцах любому элементу списка с помощью R - PullRequest
0 голосов
/ 22 января 2020

В моем наборе данных есть несколько столбцов диагностики: diag1, diag2, diag3, ... Diagnost. Я хотел бы определить условия, используя все поля диагностики. Условия также представляют собой список:

cond_list <- c ("A09", "B10", "C25", "D98")

Другими словами, если любое поле, от diag1 до diagn, имеет значения, которые соответствуют любому элементу в cond_list, условие будет закодировано как 1.

На этом этапе мой код выглядит следующим образом (просто упрощаю, но n больше 5, а список условий больше 4 условий):

col <- c("diag1", "diag2", "diag3", "diag4", "diag5")  
data$condition <- ((rowSums(data[, col] == "A09"|data[, col] == "B10"|data[, col] == "C25" == data[, col] == "D98", na.rm=T) > 0) * 1) 

Хотите знать, есть ли лучший способ, чтобы мне не приходилось вводить все условия в cond_list? У меня на самом деле больше 100 или около того.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вот один из подходов:

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

dx_df <- data.frame(
  ID = c(1,2,3),
  diag_1 = c("A09", "J32", "S45"),
  diag_2 = c("B10", "D98", "M31"),
  diag_3 = c("C25", "C25", "Q02")
)

cond_list <- c("A09", "B10", "C25", "D98")

library(tidyverse)

dx_df %>%
  pivot_longer(cols = -ID, names_to = c(".value", "number"), names_sep = "_") %>%
  group_by(ID) %>%
  mutate(condition = if_else(diag %in% cond_list, 1, 0)) %>%
  summarise(total = sum(condition)) %>%
  right_join(dx_df)

# A tibble: 3 x 5
     ID total diag_1 diag_2 diag_3
  <dbl> <dbl> <fct>  <fct>  <fct> 
1     1     3 A09    B10    C25   
2     2     2 J32    D98    C25   
3     3     0 S45    M31    Q02

В качестве отступления, если вы хотите отфильтровать ваш фрейм данных на основе строк, имеющих хотя бы один диагноз, содержащийся в вашем списке условий, вы можете сделать следующее (также используя tidyverse):

dx_df %>% 
  filter_at(vars(starts_with("diag")), any_vars(. %in% cond_list))

  ID diag_1 diag_2 diag_3
1  1    A09    B10    C25
2  2    J32    D98    C25
0 голосов
/ 22 января 2020

Вы можете использовать %in%, чтобы проверить, находятся ли значения одного вектора в другом векторе. Затем, чтобы проверить наличие хотя бы одного элемента, мы можем использовать функцию any.

Например:

data$condition <- apply(data, 1, function(x) any(x %in% cond_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...