首页 > 解决方案 > R:删除具有非缺失变量完全重叠的重复行

问题描述

许多先前的问题都强调了删除具有缺失值的重复行的各种方法,但是没有一个涉及以下情况。示例起始数据:

df <- data.frame(x = c(1, NA, 1), y=c(NA, 1, 1), z=c(0, NA, NA))
print(df)

期望的输出:

df2 <- data.frame(x = c(1, 1), y=c(NA, 1), z=c(0, NA))
print(df2)

在这种情况下,第二行被删除,因为它是第 3 行的完美子集。在实际应用程序中,我想删除包含非缺失列中所有冗余信息的行,并保留整体缺失较少的行。

我认为这可以使用 dplyr 和 distinct() 的逐行应用来完成,但无济于事。我可以用一个非常慢的 for 循环来做到这一点,但是对于数百列和数千行,这是一个糟糕的选择。

标签: rdataframedplyrna

解决方案


这是使用的另一个选项data.table

library(data.table)
#convert into long format and discard NAs
mDT <- melt(setDT(df)[, rn := .I], id.var="rn", na.rm=TRUE)[, cnt := .N , rn]

#self join and filter for rows that match to other rows
merged <- mDT[mDT, on=.(variable, value), {
      diffrow <- i.rn!=x.rn
      .(irn=i.rn[diffrow], xrn=x.rn[diffrow], icnt=i.cnt[diffrow])
    }]

#count the occurrence and delete rows where all values are matched to another row
ix <- merged[, xcnt := .N, .(irn, xrn)][
    icnt==xcnt]$irn

#delete dupe rows
df[-ix]

推荐阅读