Arrays 两个数组元素之间的差异(按Julia中一列的公共值)
这是一个与我先前的问题相关的问题,我更愿意作为一个新问题提交。假设这次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 =
[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