Как разделить набор данных с дублированной информацией на основе даты - PullRequest
1 голос
/ 26 сентября 2019

У меня есть такая ситуация:

ID   date          Weight
1   2014-12-02       23
1   2014-10-02       25
2   2014-11-03       27
2   2014-09-03       45
3   2014-07-11       56
3      NA            34
4   2014-10-05       25
4   2014-08-09       14
5      NA            NA
5      NA            NA

И я хотел бы разбить набор данных в этом, например, так:

1-

ID   date          Weight
1   2014-12-02       23
1   2014-10-02       25
2   2014-11-03       27
2   2014-09-03       45
4   2014-10-05       25
4   2014-08-09       14

2- Самый низкийДата

  ID   date          Weight
    3   2014-07-11       56
    3      NA            34
    5      NA            NA
    5      NA            NA

Я пробовал это для второго набора данных:

dt <- dt[order(dt$ID, dt$date), ]
dt.2=dt[duplicated(dt$ID), ] 

, но не работал

1 Ответ

1 голос
/ 26 сентября 2019

Получите ID, для которых date равно NA, а затем subset на основе этого

NA_ids <- unique(df$ID[is.na(df$date)])
subset(df, !ID %in% NA_ids)

#  ID       date Weight
#1  1 2014-12-02     23
#2  1 2014-10-02     25
#3  2 2014-11-03     27
#4  2 2014-09-03     45
#7  4 2014-10-05     25
#8  4 2014-08-09     14

subset(df, ID %in% NA_ids)

#   ID       date Weight
#5   3 2014-07-11     56
#6   3       <NA>     34
#9   5       <NA>     NA
#10  5       <NA>     NA

Используя dplyr, мы можем создать новый столбецкоторый имеет TRUE / FALSE для каждого ID в зависимости от наличия NA, а затем используется group_split для разбиения на список из двух.

library(dplyr)

df %>%
 group_by(ID) %>%
 mutate(NA_ID = any(is.na(date))) %>%
 ungroup %>%
 group_split(NA_ID, keep = FALSE)

Приведенная выше логика dplyr можеттакже может быть реализовано в базе R с использованием ave и split

df$NA_ID <- with(df, ave(is.na(date), ID, FUN = any))
split(df[-4], df$NA_ID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...