2016-07-24 58 views
0

我有一个data.frame,其中包含用户信息,但每个用户标识可能包含或不包含重复的行,其中的一些缺失数据在不同的变量中。 我想要做的是删除重复的用户数据,但对于每个用户,我想保留行中包含最少的缺失值在行中尽可能多地保留用户的信息。以下是创建演示数据帧的代码示例。任何帮助将特别赞赏,如果它是通过“dplyr”包完成的。R保留具有至少nas的行,用于重复行

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 
+0

对于USER_ID “B” 和“C “有很多情况下,行ha有最低限度的新加入。你想选择第一个案件还是所有这些行? – akrun

回答

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 
0

这种尝试是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 
+0

嗨Sven,感谢您的快速回复。因为我熟悉dplyr,所以我可以轻松理解代码背后的逻辑。还有一个问题,.na(。)和.keep_all分别代表什么意思?再次感谢 –

+0

@FelixZhao'.'代表数据框'User_Table'。对于'%>%'运算符,'.'总是代表左边的参数。 “distinct”中的参数'.keep_all = TRUE'对于选择* all *列是必需的。 –

+0

谢谢你的解释,这对Sven有很大的帮助 –

相关问题