删除给定阈值ε稍有不同的行的最快方法

ung

在我的数据中,我有多行,彼此之间仅稍有不同,例如0.001。如果发生这种情况,我只想保留1条记录。如果差异小于给定的阈值ε,是否有任何现有的函数/程序包可以进行逐行比较并删除行?我在想类似distinct(., epsilon = 0.001)

例:

df <- data.frame(
  IDname = c("aaa1", "bbb2", "ccc3", "ddd4"),
  g = c(0.00501, 0.00499, 2, 2),
  t = c(0.005002, 0.004991, 2.001, 2.0001),
  x = c(1.0001, 1, 2, 2.00001)
)

df

所需的输出:

  IDname       g        t       x
1   aaa1 0.00501 0.005002 1.00010
3   ccc3 2.00000 2.001000 2.00000
莫里斯·埃弗斯(Maurits Evers)

假设OP的示例有错误(请参见上面的评论),这是duplicatedpasted行值使用的解决方案

如果OP澄清会删除,而我误解了这个问题。

# Your data
df <- data.frame(
  IDname = c("aaa1", "bbb2", "ccc3", "ddd4"),
  g = c(0.00501, 0.00499, 2, 2),
  t = c(0.005002, 0.004991, 2.001, 2.0001),
  x = c(1.0001, 1, 2, 2.00001)
)

df[!duplicated(apply(round(df[, -1], 3), 1, paste, collapse = "_")), ];
#  IDname       g        t       x
#1   aaa1 0.00501 0.005002 1.00010
#3   ccc3 2.00000 2.001000 2.00000
#4   ddd4 2.00000 2.000100 2.00001

一般而言,对于任何公差epsilon

epsilon <- 0.0001;
df[!duplicated(apply(round(df[, -1], -log10(epsilon) - 1), 1, paste, collapse = "_")), ];

使用分层聚类的方法(受@BenoitLondon启发)

我们可以使用使用欧几里德距离矩阵的层次聚类,并通过相似性完全链接到聚类观察(行)。

# Calculate euclidean distance matrix
dist <- dist(df[, -1], method = "euclidean");

# Perform hierarchical clustering with complete linkage
hc <- hclust(dist, method = "complete");

现在,我们可以通过识别两个相似观测值之间的最大欧几里得距离来切割树dmax = sqrt(sum_m epsilon^2) = sqrt(m) * epsilon,其中m,(数字)列的数量。因此,我们可以高高砍树h = dmax

# Cut the tree
epsilon <- 0.0001;
grp <- cutree(hc, h = sqrt(ncol(df[, -1])) * epsilon);
grp;
#[1] 1 1 2 3    

然后倒塌dataframe

df[!duplicated(grp), ];
#  IDname       g        t       x
#1   aaa1 0.00501 0.005002 1.00010
#3   ccc3 2.00000 2.001000 2.00000
#4   ddd4 2.00000 2.000100 2.00001

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Oracle:生成的列中的值稍有不同的行

嵌套 for 循环,但稍有不同

如何重用稍有不同的代码

编写一种方法以服务稍有不同的场景C#

给定条件下选择矩阵行的最快方法

jQuery-从大型表中删除所有行的最快方法

在给定所有行的索引的情况下寻找最快的方法来查找列的值

在 Windows 中删除具有相同名称但不同文件扩展名的文件差异的最快方法

在DataContext稍有不同的情况下,如何重用UserControl?

如何编写宏以匹配稍有不同的match语句?

XGBoost对列表与数组的预测稍有不同,这是正确的吗?

删除具有给定条件的行

有没有更快的方法从文件中删除行(给定行号)?

从大文件中删除特定行的最快方法是什么?

在Python中返回具有给定id的二维列表行(的副本)的最有效(最快捷)方法是什么?

核心数据:删除实体所有实例的最快方法

删除具有特定值大于给定数量(numpy)的行的最佳方法

从数组中删除所有出现的值的最快方法是最快拼接还是更快筛选?

设置numpy数组阈值的最快方法是什么?

根据阈值变化在np数组中筛选值的最快方法

设置每列具有不同阈值的numpy数组的阈值

删除bash中多余行的最快方法,或者如果string为#,则删除最后一行

在 F# 中创建具有给定大小的 nan 数组的最快方法是什么?

计算字符串的所有子字符串并检查给定条件的最快方法

删除稀疏组的最快方法?

删除具有阈值或类别的行,并在熊猫中保存为多个CSV

使用dplyr从数据框中删除所有遵循过滤器阈值的行

删除方差阈值下的pandas df行

从数据帧中删除低于阈值的行