首页 > 解决方案 > 根据 NA 计数删除重复记录

问题描述

我有一个名为 ID 的主键数据集。主键在多行中重复。重复行具有不同数量的缺失信息,表示为 NA。

我想按主键 ID 分组,然后保留信息最多、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

标签: rfiltergroup-byduplicates

解决方案


一种选择是根据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]

推荐阅读