在我的数据中,我有多行,彼此之间仅稍有不同,例如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
假设OP的示例有错误(请参见上面的评论),这是duplicated
在paste
d行值上使用的解决方案。
如果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] 删除。
我来说两句