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
这两种方法的区别在于它们如何处理第一列中 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 中只有以下 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
这两种方法的区别在于它们如何处理第一列中 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