r - 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 循环来做到这一点,但是对于数百列和数千行,这是一个糟糕的选择。
解决方案
这是使用的另一个选项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]
推荐阅读
- chatbot - 如果它是动态的,如何创建名称实体?
- machine-learning - 保存机器学习模型以用于新数据
- r - 尝试使用 ML 模型作为 R 中的目标函数
- python - 如何定义一个 pandas 数据框以根据存储在 csv 文件中的 id 读取图像?
- ruby-on-rails - rails中的delivery和deliver_now有什么区别?
- git - PhpStorm git pull request 默认分支
- python - 使用 StatsModels 进行二阶多项式的分位数回归
- postgresql - 如何使用从 string_to_array 到 JOIN 到查找表的数组值
- python - 引用日期时如何更新 dataframe.ix 代码
- sql-update - 如何在 symfony 5 中不使用表单创建更新功能