Получите 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)