【问题标题】:R keep rows with least nas for duplicated rowsR为重复行保留最少nas的行
【发布时间】:2016-07-24 12:50:51
【问题描述】:

我有一个包含用户信息的 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

【问题讨论】:

  • 对于 User_ID "B" 和 "C" 有多种情况,行具有最小 NA。您要选择第一个案例还是所有这些行。

标签: r duplicates filtering dplyr


【解决方案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

【讨论】:

  • 嗨,斯文,感谢您的快速回复。因为我熟悉 dplyr,所以我可以很容易地理解你的代码背后的逻辑。还有一个问题,is.na(.) 和 .keep_all 中的点分别是什么意思?再次感谢
  • @FelixZhao . 代表数据框User_Table。对于%&gt;% 运算符,. 始终表示左参数。 distinct 中的参数 .keep_all = TRUE 是选择所有列所必需的。
  • 感谢您的解释,这对斯文很有帮助
【解决方案2】:

我们可以试试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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多