使用 R 如何基于多列删除重复项,但选择重复项的"most"完整版本



我有一个脚本,可以根据三列中的重复值进行删除。有三个以上的列,但我想删除基于那些特定的

DF2021 <-DF2021 [!duplicated (DF2021[,c("column1","column2","column3")]),]

上面的脚本很有效,每次基于这三列出现重复时,我都会留下一行。

下一步是我想知道如何确保我留下了基于标准的行。例如,我想要NA最少的一行。

column1|column2|column3|column4|column5|column6|column 7
Jan     Tue    2020   Blue    Warm  Hospital    NA
Jan     Tue    2020   Blue    Warm     NA       NA
Jan     Tue    2020   Blue    NA       NA       NA
Feb     Thu    2020   Red     NA       NA       NA
Feb     Thu    2020   Red     Warm     NA       NA
Feb     Thu    2020   Red     Warm   Garden    Run
Mar     Thu    2020   Red     Cold   Desk      Bus

最后,我希望重复的值只剩下三行。

column1|column2|column3|column4|column5|column6|column 7
Jan      Tue   2020    Blue    Warm   Hospital   NA
Feb      Thu   2020     Red    Warm   Garden    Run
Mar      Thu   2020     Red    Cold   Desk      Bus

注意,如果我要做

DF2021 <- DF2021[complete.cases(DF2021),]

它只会给我二月和三月的行,而不是一月;大多数";但不必";"满";基于这三行的重复行中的行。

试试这个。您可以创建一个函数来检测完整的行和只有一个NA的行。有了它,您可以使用索引并选择该行。这里的代码:

#Index for selection
myfun <- function(x)
{
y <- length(which(is.na(x)))
y <- ifelse(y<=1,1,0)
return(y)
}
#Apply
index <- which(apply(df,1,myfun)==1)
#Output
out <- df[index,]

输出:

column1 column2 column3 column4 column5  column6 column7
1     Jan     Tue    2020    Blue    Warm Hospital    <NA>
6     Feb     Thu    2020     Red    Warm   Garden     Run
7     Mar     Thu    2020     Red    Cold     Desk     Bus

最新更新