Как изменить размер df, чтобы у нас была одна запись для каждого идентификатора

#r

#r

Вопрос:

У меня есть data.frame, который выглядит так:

введите описание изображения здесь

Могу ли я быстро изменить его, чтобы у меня была только одна запись для каждого идентификатора, что-то вроде этого:

введите описание изображения здесь

df можно построить с использованием кодов:

 df<-structure(list(ID = structure(c("05-102", "05-102", "05-102", 
"01-103", "01-103", "01-103", "08-104", "08-104", "08-104", "05-105", 
"05-105", "05-105", "02-106", "02-106", "02-106", "05-107", "05-107", 
"05-107", "08-108", "08-108", "08-108", "02-109", "02-109", "02-109", 
"05-111", "05-111", "05-111", "07-115", "07-115", "07-115"), label = "Unique Subject Identifier", format.sas = "$"), 
    EXSTDTC1 = structure(c(16876, NA, NA, 17022, NA, NA, 17024, 
    NA, NA, 17032, NA, NA, 17038, NA, NA, 17092, NA, NA, 17108, 
    NA, NA, 17155, NA, NA, 17247, NA, NA, 17333, NA, NA), class = "Date"), 
    EXSTDTC6 = structure(c(NA, 16885, NA, NA, NA, 17031, NA, 
    NA, 17032, NA, NA, 17041, NA, NA, 17047, NA, NA, 17100, NA, 
    NA, 17116, NA, 17164, NA, NA, NA, 17256, NA, 17342, NA), class = "Date"), 
    EXSTDTC3 = structure(c(NA, NA, 16881, NA, 17027, NA, NA, 
    17029, NA, NA, 17037, NA, NA, 17043, NA, NA, 17097, NA, NA, 
    17113, NA, NA, NA, 17160, NA, 17252, NA, NA, NA, 17338), class = "Date"), 
    EXDOSEA1 = c("73.8 147.6", NA, NA, "64.5 129", NA, NA, "62.7 125.4", 
    NA, NA, "114 57", NA, NA, "60 117.5", NA, NA, "48.6 97.2", 
    NA, NA, "61.2 122.4", NA, NA, "47.7 95.4", NA, NA, "51.6 103.2", 
    NA, NA, "68 136", NA, NA), EXDOSEA6 = c(NA, "100", NA, NA, 
    NA, "86", NA, NA, "83.5", NA, NA, "76", NA, NA, "39.2", NA, 
    NA, "32", NA, NA, "81.5", NA, "69.6", NA, NA, NA, "68", NA, 
    "91", NA), EXDOSEA3 = c(NA, NA, "1600", NA, "4302", NA, NA, 
    "4185", NA, NA, "3900", NA, NA, "3921", NA, NA, "3300", NA, 
    NA, "4080", NA, NA, NA, "3183", NA, "3300", NA, NA, NA, "1514"
    )), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame"
))
 

Ответ №1:

Вы можете удалить все NA значения для каждого ID :

 library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(across(EXSTDTC1:EXDOSEA3, na.omit))

#    ID     EXSTDTC1   EXSTDTC6   EXSTDTC3   EXDOSEA1   EXDOSEA6 EXDOSEA3
#   <chr>  <date>     <date>     <date>     <chr>      <chr>    <chr>   
# 1 01-103 2016-08-09 2016-08-18 2016-08-14 64.5 129   86       4302    
# 2 02-106 2016-08-25 2016-09-03 2016-08-30 60 117.5   39.2     3921    
# 3 02-109 2016-12-20 2016-12-29 2016-12-25 47.7 95.4  69.6     3183    
# 4 05-102 2016-03-16 2016-03-25 2016-03-21 73.8 147.6 100      1600    
# 5 05-105 2016-08-19 2016-08-28 2016-08-24 114 57     76       3900    
# 6 05-107 2016-10-18 2016-10-26 2016-10-23 48.6 97.2  32       3300    
# 7 05-111 2017-03-22 2017-03-31 2017-03-27 51.6 103.2 68       3300    
# 8 07-115 2017-06-16 2017-06-25 2017-06-21 68 136     91       1514    
# 9 08-104 2016-08-11 2016-08-19 2016-08-16 62.7 125.4 83.5     4185    
#10 08-108 2016-11-03 2016-11-11 2016-11-08 61.2 122.4 81.5     4080   
 

Если в столбце для вашего фактического набора данных будет более одного NA значения non ID , вы можете свернуть их в одну строку, разделенную запятыми.

 df %>%
  group_by(ID) %>%
  summarise(across(EXSTDTC1:EXDOSEA3, ~toString(na.omit(.))))
 

Комментарии:

1. Отличный ответ! вы даже думаете о случае, когда в одной переменной для одного идентификатора более одного значения. Хороший улов для этого!

2. похоже across , это новая функция в dplyr. Есть ли другой способ сделать это? Я не могу обновить свою версию. 🙁

3. Да, вы можете использовать summarise_at . Замените последнюю строку на summarise_at(vars(EXSTDTC1:EXDOSEA3), na.omit) Или summarise_at(vars(EXSTDTC1:EXDOSEA3), ~toString(na.omit(.))) @Stataq