Arrays 两个数组元素之间的差异(按Julia中一列的公共值)

Arrays 两个数组元素之间的差异(按Julia中一列的公共值),arrays,julia,difference,Arrays,Julia,Difference,这是一个与我先前的问题相关的问题,我更愿意作为一个新问题提交。假设这次Julia中只有以下两个数组: [5.0 3.5 6.0 3.6 7.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 =

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

[5.0  3.5
 6.0  3.6
 7.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

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

不带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
完美:-)第一列的值总是唯一的。
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