【问题标题】:R function to compare two lists against each other for correctionR函数将两个列表相互比较以进行更正
【发布时间】:2020-10-01 14:32:08
【问题描述】:

假设我有两个向量,例如:

a <- c(1,2,2.1,2.2,3,4,5,6,7,8,9)
b <- c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,7.6,7.7,8.5)

用函数过滤两个向量:

a_corrected_by_b <- c(1,2,3,4,5,6,7,8,9)
b_corrected_by_a <- c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5)

因此,当您将两个列表彼此相减时,您会得到:

c <- (a_corrected_by_b - b_corrected_by_a)
#((1-0.5), (2-1.5), (3-2.5), (4-3.5), (5-4.5), (6-5.5), (7-6.5), (8-7.7), (9-8.5))

我只是不知道如何过滤两个向量,这样你就可以得到两个可以正确相减的向量。

每个b向量值之间应该有一个a向量值,每个a向量值之间应该有一个b向量值。

它也应该是与任一列表中的值最接近的值。那么是否有任何函数可以通过这两个向量并删除不必要的值?所以这两个向量可以是相同的长度,并且有适当的值可以相互减去。

【问题讨论】:

  • 当有多个值时,您如何确定a 的哪个值位于b 的两个值之间?例如。在a 2,2.1,2.2 介于1.5,2.5b 之间
  • @markus 是最接近的值,例如,列表 b 中的 1.5 与列表 a 中的 2 相关。列表 b 中的 2.5 与列表 a 中的 3 相关。比较时,列表 a 中的数字也应始终大于列表 b 中的数字。
  • @ChuckP 我确实想这样做,但是它有一些细微差别。例如,列表 a[1] 可以是 5,b[1] 可以是 3,可以减去。但是 a[6] 可能是 12 而 b[6] 可能是 17 这不行。

标签: r vector filtering


【解决方案1】:

您似乎想将a 中的每个数字与b 中的每个数字进行比较,并保留a 的任何成员,该成员是集合中超过b 成员之一的最小成员。如果a 的单个成员对b 的多个值满足此条件,则您只在匹配项中包含b 的最大值。

确实必须这样做,因为如果您允许将a 的成员与较低较高的b 的成员匹配,那么匹配将变得无法确定且不正确已定义。

您可以使用outerunique 实现此目的:

correct <- function(a, b)
{
  d <- outer(a, b, `-`)
  d[d < 0] <- NA
  data.frame(a_corrected_by_b = a[unlist(unique(apply(d, 2, which.min)))],
             b_corrected_by_a = b[unlist(unique(apply(d, 1, which.min)))])
}

例如:

correct(a, b)
#>   a_corrected_by_b b_corrected_by_a
#> 1                1              0.5
#> 2                2              1.5
#> 3                3              2.5
#> 4                4              3.5
#> 5                5              4.5
#> 6                6              5.5
#> 7                7              6.5
#> 8                8              7.7
#> 9                9              8.5

请注意,有些序列不会通过这种方法“纠正”,例如,如果b 的每个成员都高于a 的每个成员。

此外,它不是对称的,因为在平局的情况下,两个集合中的一个必须优先,所以correct(a, b) 将不同于correct(b, a),尽管它们都会给出有效的解决方案。这是因为上述问题并不总是有唯一的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多