Julia 中一列的公共值通过两个数组的元素之间的差异

Difference between elements of two arrays by common values of one column in Julia

这是一个与我之前的问题相关的问题,我更愿意将其作为新问题提交。假设这次我们在 Julia 中只有以下 2 个数组:

[5.0  3.5
 6.0  3.6
 7.0  3.0]

[5.0  4.5
 6.0  4.7
 8.0  3.0]

我想获得一个数组,该数组计算第二列元素之间的差异(第一个数组减去第二个数组,按此顺序)但仅针对第一列的公共值。结果数组必须如下所示:

[5.0  -1
 6.0  -1.1]

我们如何在 Julia 中编写代码来获取最后一个数组?

假设:

x = [5.0  3.5
     6.0  3.6
     7.0  3.0]
y = [5.0  4.5
     6.0  4.7
     8.0  3.0]

同样,有很多方法可以做到这一点。使用 DataFrames 你可以写:

using DataFrames
df = innerjoin(DataFrame(x, [:id, :x]), DataFrame(y, [:id, :y]), on=:id)
df = [df.id df.x-df.y]
## 2×2 Matrix{Float64}:
##  5.0  -1.0
##  6.0  -1.1

您还可以将原始数组转换为字典并使用它们:

dx = Dict(x[i,1] => x[i,2] for i in 1:size(x, 1))
dy = Dict(y[i,1] => y[i,2] for i in 1:size(y, 1))
ks = sort!(collect(intersect(keys(dx), keys(dy))))
[ks [dx[k]-dy[k] for k in ks]]
## 2×2 Matrix{Float64}:
##  5.0  -1.0
##  6.0  -1.1

这两种方法的区别在于它们如何处理第一列中 xy 中的重复项。第一个将生成所有组合,第二个将仅存储每个键的最后一个值。

没有DataFrames.jl的解决方案是

julia> idx = findall(x[:,1] .== y[:,1]) # findall match of 1st col
2-element Vector{Int64}:
 1
 2

julia> [x[idx,1] (x-y)[idx,2]]
2×2 Matrix{Float64}:
 5.0  -1.0
 6.0  -1.1