R 根据NA计数删除重复记录
我有一个数据集,它有一个名为ID的主键。主键跨多行复制。重复的行有不同数量的丢失信息,表示为NA 我想按主键ID分组,然后保留信息最多、NA最少的记录 我已经获得了下面的代码,以便对重复的行进行分组,但我正在努力删除具有最多NA的行 对于下面的数据,我希望保留第一行,同时删除第二行和第三行,因为它们缺少的值比第一行多 第1行仅缺少1个值,应保留,而第2-3行分别缺少2个和3个值R 根据NA计数删除重复记录,r,filter,group-by,duplicates,R,Filter,Group By,Duplicates,我有一个数据集,它有一个名为ID的主键。主键跨多行复制。重复的行有不同数量的丢失信息,表示为NA 我想按主键ID分组,然后保留信息最多、NA最少的记录 我已经获得了下面的代码,以便对重复的行进行分组,但我正在努力删除具有最多NA的行 对于下面的数据,我希望保留第一行,同时删除第二行和第三行,因为它们缺少的值比第一行多 第1行仅缺少1个值,应保留,而第2-3行分别缺少2个和3个值 dupes = df %>% group_by(ID) %>% filter(n()>1)
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
一个选项是基于每行中
NA
s的数量创建一个条件,即在按“ID”分组后,slice
具有最小NA
元素数量的行
library(dplyr)
df %>%
mutate(n = rowSums(is.na(.))) %>%
group_by(ID) %>%
slice(which.min(n)) %>%
select(-n)
或与
数据类似的逻辑。表
library(data.table)
setDT(df)[df[, .I[which.min(Reduce(`+`, lapply(.SD, is.na)))], ID]$V1]
这不是公平点吗?
df%>%filter(!is.na(Product))
Fair point,但不是。我会编辑文章来说明,但数据集是30列,有大量缺失值的组合。在单个列上按NA进行筛选将无法做到这一点。假设ID 1的NA计数为10 15 20(在30列中),您将保留哪一列。如果希望保留10,请删除15和20。尝试df%>%mutate(n=rowSums(is.NA())%%>%group\u by(ID)%%slice(which.min(n))
这就成功了。akrun的建议似乎与使用slice非常相似,但需要花费更长的时间。你的跑得快多了。非常感谢你的帮助!