Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据NA计数删除重复记录_R_Filter_Group By_Duplicates - Fatal编程技术网

R 根据NA计数删除重复记录

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)

我有一个数据集,它有一个名为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

一个选项是基于每行中
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非常相似,但需要花费更长的时间。你的跑得快多了。非常感谢你的帮助!