Как мне объединить несколько строк в одну, используя R? - PullRequest
0 голосов
/ 12 марта 2020

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

У меня около 20 разных переменных. Некоторые переменные должны оставаться неизменными при объединении строк (например, пациент с 4 строками, входящий в группу 1, должен по-прежнему находиться в группе 1 при объединении строк), но у меня также есть переменные, которые должны удовлетворять определенному условию ( например, если пациент перенес операцию в одном (или нескольких) рядах, он должен стать «да». Если нет, он должен стать «нет»).

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

Так, например, у меня есть следующий набор данных (мои извинения за то, как я это представляю, я новичок в Stackoverflow)

**Patient_Id** /**Group** /**Age** /**Gender** /**surgery y/n** /**no of surgeries** 

1 - 1 - 63 - F - no - 0      

1 - 1 - 63 - F - no - 0

1 - 1 - 64 - F - yes - 1

2 - 0 - 60 - M - yes - 2

3 - 1 - 65 - M - no - 0

4 - 0 - 60 - F - no - 0

4 - 0 - 61 - F - yes - 1

4 - 0 - 62 - F - yes - 1

И я хочу создать такой фрейм данных

**Patient_Id** /**Group** /**Age** /**Gender** /**surgery y/n** /**no of surgeries** 

1 - 1 - 63,33 - F - yes - 1 

2 - 0 - 60 - M - yes - 2

3 - 1 - 65 - M - no - 0

4 - 0 - 61 - F - yes - 2

Кто-нибудь знает, какую функцию лучше всего использовать? Или как начать? Заранее спасибо!

Данные в формате dput.

df1 <-
structure(list(Patient_Id = c(1, 1, 1, 2, 3, 4, 4, 4), 
Group = c(1, 1, 1, 0, 1, 0, 0, 0), Age = c(63, 63, 64, 
60, 65, 60, 61, 62), Gender = c("F", "F", "F", "M", 
"M", "F", "F", "F"), `surgery y/n` = c("no", "no", "yes", 
"yes", "no", "no", "yes", "yes"), `no of surgeries` = c(0L, 
0L, 1L, 2L, 0L, 0L, 1L, 1L)), row.names = c(NA, -8L), 
class = "data.frame")


df2 <-
structure(list(Patient_Id = c(1, 2, 3, 4), 
Group = c(1, 0, 1, 0), Age = c("63,33", 
"60", "65", "61"), Gender = c("F", "M", 
"M", "F"), `surgery y/n` = c("yes", "yes", 
"no", "yes"), `no of surgeries` = c(1, 2, 
0, 2)), row.names = c(NA, -4L), 
class = "data.frame")

Структура моего кадра данных выглядит следующим образом:

str (SMARTdata_50j_diagc_2016) 'data. кадр: 458794 об. из 20 переменных:

$ Groep: Коэффициент w / 2 уровня "0", "1": 2 2 2 2 2 1 2 2 2 2 ...

$ Ziekenhuis_Nr: Коэффициент w / 13 уровней "1", "10", "11", ..: 2 8 4 11 3 7 10 9 13 6 ...

$ Ziekenhuistype: коэффициент с 3 уровнями "0", " 1 "," 2 ": 2 2 2 2 1 1 2 1 2 3 ...

$ Patient_Id: номер 85550 101414 239946 291650 140558 ...

$ DBC_Id: номер 181394 230887 448945 524873 251352 ...

$ Diagnose_Code: коэффициент с 5 уровнями "0", "1", "2", "3", ..: 1 1 1 1 1 1 1 1 1 1. ..

$ Zorgtype_Code: коэффициент с 2 уровнями "0", "1": 2 2 2 1 2 2 2 1 1 2 ...

$ Lft_patient_openenDB C: num 50 80 66 60 67 64 54 71 70 76 ...

$ Geslacht: Коэффициент с 2 уровнями "0", "1": 1 1 2 2 2 1 1 1 2 1 ...

$ MRI_nee_ja: Коэффициент с 2 уровнями "0", "1": 1 1 1 2 1 1 1 1 1 1 ...

$ MRI_Aantal: num 0 0 0 1 0 0 0 0 0 0 ...

$ Artroscopie_nee_jaz_jam: Коэффициент с 3 уровнями "0", "1", "2": 1 1 1 3 1 1 1 1 1 ...

$ Artroscopie_aan таль: число 0 0 0 1 0 0 0 0 0 0 ...

$ Jaar_openen_DB C: число 2016 2017 2018 2017 2017 ...

$ Mnd_openen_DB C: число 12 5 6 2 5 8 10 11 1 1 ...

$ Jaar_sluiten_DB C: номер 2017 2017 2018 2017 2017 ...

$ Mnd_sluiten_DB C: номер 4 9 10 4 9 12 2 3 4 5 ...

$ Aantal_overigeDBC_bijopenen: num 1 1 2 1 0 0 1 0 0 0 ...

$ open_DB C: 'yearmon' num De c 2016 май 2017 июнь 2018 фев 2017 ...

$ sluiten_DB C: 'yearmon' num апр. 2017 сент. 2017 окт. 2018 апр. 2017 ... ... 1063 *

1 Ответ

0 голосов
/ 12 марта 2020

Ваш вопрос прост. Один из способов сделать это через пакет dplyr:

library(dplyr)

df1 %>% 
 group_by(Patient_Id) %>% 
 summarise(Group = first(Group), 
           Age = mean(Age), 
           Gender = first(Gender), 
           `no of surgeries` = sum(`no of surgeries`), 
          `surgery y/n` = ifelse(`no of surgeries` == 0, 'no', 'yes'))

, что дает

# A tibble: 4 x 6
  Patient_Id Group   Age Gender `no of surgeries` `surgery y/n`
       <dbl> <dbl> <dbl> <chr>              <int> <chr>        
1          1     1  63.3 F                      1 yes          
2          2     0  60   M                      2 yes          
3          3     1  65   M                      0 no           
4          4     0  61   F                      2 yes 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...