Выберите все строки на основе условий в двух столбцах в R (несколько случаев в строке) - PullRequest
2 голосов
/ 30 марта 2020

Хорошо, я новичок, и у меня есть проблемы с формулировкой моих вопросов, поэтому, пожалуйста, перенаправьте меня, если я смогу найти ответ где-нибудь еще и простить меня:)

Я работаю с большими грязными данными файл пациента (> 40 миллионов строк). У каждого пациента (id) есть несколько рядов. Каждая строка (приблизительно) представляет одну консультацию с кодом симптома / заболевания (icp c). Я хочу сократить набор данных для всех рядов пациентов с конкретными условиями c (icp c) в одной из их консультаций / строк, но сохранить все ряды с другими условиями для этих пациентов. Я также хотел бы сохранить столбец reg.date.

Мой необработанный data.frame (x) выглядит примерно так (это сфабрикованные данные, идентификатор в моем наборе данных намного длиннее, и я пропустил ненужные столбцы, которые Мне нравится отбрасывать):

id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
100 B10 01JUN2017
100 A04 11JAN2008
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015

Скажем, я хочу только сохранить пациентов с D95 и / или A01 в наборе данных. Мне удалось установить подмножество:

subset(x, ICPC == c("D95", "A01"))

Но это оставляет меня только после консультаций, где D95 и A01 были зарегистрированы:

id icpc reg.date
123 D95 19JUN2015
332 A01 16MAR2010
113 D95 16JAN2013
113 A01 01MAY2009
551 D95 09MAY2015

Это фрейм данных. Я хочу:

id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 30 марта 2020

с использованием base, поскольку вы указали subset

df_2 <- by(df, df$id, function(x) subset(x, any(x$icpc %in% c("D95", "A01"))))
df_2 <- do.call(rbind, lapply(df_2, data.frame))
row.names(df_2) <- NULL

    id icpc  reg.date
1  113  T08 18MAR2018
2  113  P28 19JAN2017
3  113  D95 16JAN2013
4  113  A01 01MAY2009
5  123  D95 19JUN2015
6  123  F85 15AUG2016
7  332  A01 16MAR2010
8  332  A04 20JAN2018
9  332  K20 20FEB2017
10 551  B12 03APR2011
11 551  D95 09MAY2015

с использованием dplyr - на мой взгляд, намного проще, но использует filter вместо subset

library(dplyr)
df %>% 
  group_by(id) %>% 
  filter(any(icpc %in% c("D95", "A01")))

      id icpc  reg.date 
   <dbl> <chr> <chr>    
 1   123 D95   19JUN2015
 2   123 F85   15AUG2016
 3   332 A01   16MAR2010
 4   332 A04   20JAN2018
 5   332 K20   20FEB2017
 6   113 T08   18MAR2018
 7   113 P28   19JAN2017
 8   113 D95   16JAN2013
 9   113 A01   01MAY2009
10   551 B12   03APR2011
11   551 D95   09MAY2015
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...