R为重复的行保留行数最小的行

时间:2016-07-24 12:50:52

标签: r duplicates filtering dplyr

我有一个包含用户信息的data.frame,但每个用户ID可能有也可能没有重复的行,并且在不同的变量中有相当多的缺失数据。 我想要做的是删除重复的用户数据,但对于每个用户,我想保留行中包含最少缺失值的行,以尽可能多地保留用户的信息。以下是创建演示数据框的代码示例。任何帮助都将受到赞赏,特别是如果它是通过" dplyr"封装

User_Table <- data.frame(User_ID =rep(c("UserA","UserB","UserC"),each=3),
                     VariableA= rep(c(1,NA,2),each=3),
                     VariableB = rep(c("TypeA","TypeB",NA),each=3),
                     VariableC = rep(c(NA,2,3),each=3))

User_Table[c(1,2,4,5,6,7),3] <- NA

2 个答案:

答案 0 :(得分:1)

我们可以尝试data.table

library(data.table)
setDT(User_Table)[User_Table[, .I[which.min(Reduce(`+`, 
            lapply(.SD, is.na)))], User_ID]$V1]
#   User_ID VariableA VariableB VariableC
#1:   UserA         1     TypeA        NA
#2:   UserB        NA        NA         2
#3:   UserC         2        NA         3

答案 1 :(得分:1)

这是dplyr的方法:

User_Table %>%
  arrange(rowSums(is.na(.))) %>%        # sort rows by number of NAs
  distinct(User_ID, .keep_all = TRUE)   # keep first row per User_ID only

结果:

  User_ID VariableA VariableB VariableC
1   UserA         1     TypeA        NA
2   UserC         2      <NA>         3
3   UserB        NA      <NA>         2