【问题标题】:Remove Duplicate Records Based on NA Count根据 NA 计数删除重复记录
【发布时间】:2019-08-01 20:57:23
【问题描述】:

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

我想按主键 ID 分组,然后保留信息最多、NA 最少的记录。

我得到了下面的代码来让我对重复项进行分组,但我正在努力删除具有最多 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

【问题讨论】:

  • 这不是df%>% filter(!is.na(Product))
  • 公平点,但不是。我将编辑帖子进行说明,但数据集是 30 列,具有大量缺失值的组合。在单个列上按 NA 过滤不会这样做。
  • 假设您的 ID 1 的 NA 计数为 10 15 20(在 30 列中),您将保留哪一个
  • 我想保留 10,放弃 15 和 20。
  • 试试df %>% mutate(n = rowSums(is.na(.))) %>% group_by(ID) %>% slice(which.min(n))

标签: r filter group-by duplicates


【解决方案1】:

一种选择是根据每行中NAs 的数量创建一个条件,即在按“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]

【讨论】:

  • 成功了。 akrun 的建议使用 slice 似乎非常相似,但需要更长的时间。你的跑得更快。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多