Удалить дубликаты записей на основе количества NA - PullRequest
1 голос
/ 11 марта 2019

У меня есть набор данных с первичным ключом, который называется ID. Первичный ключ дублируется в нескольких строках. Дублирующие строки содержат различное количество недостающей информации, представленной в виде NA.

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

Я получил код ниже, чтобы получить grouped_by для дубликатов, но я изо всех сил пытаюсь удалить строки с большинством NA.

С данными, приведенными ниже, я хотел бы сохранить первую строку, отбрасывая вторую и третью, поскольку в них пропущено больше значений, чем в первой строке.

В строке 1 отсутствует только 1 значение, и его следует сохранить, в то время как в строках 2-3 отсутствуют значения 2 и 3 соответственно.

dupes = df %>%
  group_by(ID) %>%
  filter(n()>1)

ID   Product   Cost   Date   Name    State
1      X       NA     2019   John    CA
1      NA      15     NA     Bill    GA
1      NA      NA     2019   NA      CA
2      Y       15     2019   Chris   CA

1 Ответ

1 голос
/ 11 марта 2019

Один из вариантов - создать условие на основе количества NA s в каждой строке, т. Е. После группировки по 'ID', slice строк, которые имеют минимальное количество NA элементов

library(dplyr)
df %>%
   mutate(n = rowSums(is.na(.))) %>% 
   group_by(ID) %>% 
   slice(which.min(n)) %>% 
   select(-n)

или аналогичная логика с data.table

library(data.table)
setDT(df)[df[, .I[which.min(Reduce(`+`, lapply(.SD, is.na)))], ID]$V1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...