Как найти пациента как минимум с тремя значениями HbA1 c более 6,5 с использованием R - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть набор данных, содержащий идентификатор пациента и HbA1 c.

df <- data.frame(PATIENT_ID=c(1,1,1,1,2,2,2,3,3,3),
                     HbA1c=c(6.4,6.5,6.7,6.5,6.7,6.1,6.9,6.7,7.0,6.4))

Я хочу найти пациентов, у которых было как минимум три значения HbA1 c больше 6,5. Выходными данными должен быть набор данных с уникальным идентификатором пациента и первым значением HbA1 c, превышающим 6,5. Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

После группировки по 'PATIENT_ID' мы можем filter иметь те, у которых 3 или более значения HbA1 c больше или равны 6,5, и получить distinct 'PATIENT_ID'

library(dplyr)
df %>% 
      group_by(PATIENT_ID) %>%
      filter(sum(HbA1c >= 6.5) >=3 & HbA1c >= 6.5) %>%
      distinct(PATIENT_ID, .keep_all = TRUE)
# A tibble: 1 x 2
# Groups:   PATIENT_ID [1]
#  PATIENT_ID HbA1c
#      <dbl> <dbl>
#1          1   6.5

Или с slice

df %>%
 filter(HbA1c >= 6.5) %>%
    group_by(PATIENT_ID) %>% 
    filter(n() >=3) %>%
    slice(1)
# A tibble: 1 x 2
# Groups:   PATIENT_ID [1]
#  PATIENT_ID HbA1c
#       <dbl> <dbl>
#1          1   6.5

Или с использованием data.table

library(data.table)
setDT(df)[HbA1c >= 6.5, .SD[.N >=3], PATIENT_ID][1]
#   PATIENT_ID HbA1c
#1:          1   6.5

Или с base R

i1 <- rowsum(+(df$HbA1c >= 6.5), df$PATIENT_ID) >=3
subset(df, PATIENT_ID %in% names(which(i1[,1])) & HbA1c >= 6.5)[1,]

Или другой вариант table в base R

names(which(table(df$PATIENT_ID, df$HbA1c >= 6.5)[,2] >=3))
#[1] "1"

Или вариант table

names(which(table(subset(df, HbA1c >= 6.5)$PATIENT_ID) >=3))
0 голосов
/ 18 апреля 2020

В базе R мы можем использовать ave для подсчета количества HbA1c значений, которые больше 6,5 для каждого PATIENT_ID, затем использовать subset для выбора только PATIENT_ID столбца и возврата unique строк .

unique(subset(df, ave(HbA1c >= 6.5, PATIENT_ID, FUN = sum) >= 3, 
              select = PATIENT_ID))

#  PATIENT_ID
#1          1

Мы также можем использовать tapply:

inds <- tapply(df$HbA1c >= 6.5, df$PATIENT_ID, sum) >= 3
names(inds[inds])
#[1] "1"

Чтобы получить первый HbA1c, превышающий 6,5, мы можем сделать:

df1 <- subset(df, ave(HbA1c >= 6.5, PATIENT_ID, FUN = sum) >= 3)
aggregate(HbA1c~PATIENT_ID, df1, function(x) x[which.max(x >= 6.5)])


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