gpt4 book ai didi

r - 按 R 中的条件从 data.frame 中(几乎)相等的列列表

转载 作者:行者123 更新时间:2023-12-04 09:39:09 25 4
gpt4 key购买 nike

首先没有详细信息

我有像这样的data.frame:

  val1 val2 val3 val4 val5
1 1.1 2 1.1 2.1 4.2
2 5.7 5 5.6 4.9 9.9
3 3.1 3 3.2 2.9 5.9
4 9.6 1 9.5 1.0 2.0

并且想要获得(几乎)相等的行。期望的结果类似于

[1] "val1" "val2" "val5"

因为列 val3 几乎等于 val1val4 几乎等于 val2val5 不同。

详细信息:

  • “几乎”等于是什么意思(只是下面列出的选项之一):
    • 值的绝对差值小于固定数字(上面的示例为 0.2)
    • 值的相对差异小于固定数字(样本约为 11%)
    • 其他有意义的指标;-)
  • 线性相关列的列表会更好(但我认为这更复杂)(这意味着 val5 也是由 val2< 形成的组的一部分val4 因为它大约是值的两倍)
  • 它不必太快,O(n^2) 就可以了。 (我的框架只有大约 12 行和 300 列)
  • 如果这是不可能的,完全相等的列列表也可以以某种方式工作。然后我会在之前应用round()函数

最佳答案

如何选择相等的行还没有明确定义;例如,您可以有三列,其中 A 和 B 是“相等”,B 和 C 是“相等”,但 A 和 C 不是。那该怎么办呢?解决这个问题的一种方法可能是使用层次聚类,可能像这样:

使用Andrie回答中的数据,首先将其转置并使其成为矩阵;我还将标准化每一行(什么是列)作为寻找线性组合的开始;这将对彼此精确倍数的行进行分组,但不会对更复杂的组合进行分组。

d <- t(as.matrix(d))
s <- rowSums(d)
ds <- sweep(d, 1, s, `/`)

我们现在制作一棵树,出于兴趣,将其绘制出来。这使用默认距离函数(欧几里得),但其他距离函数也是可能的。

tree <- hclust(dist(ds))
plot(tree)

plot of tree from hclust

然后,我们选择将树分成几组的位置(您可以在此处选择两棵树必须有多接近才能“相等”);我将其与值的总和一起输出,以查看是否有一个是另一个的倍数。

> grp <- cutree(tree, h=0.1)
> cbind(grp, s)

grp s
val1 1 19.5
val2 2 11.0
val3 1 19.4
val4 2 10.9
val5 2 22.0

关于r - 按 R 中的条件从 data.frame 中(几乎)相等的列列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com