【问题标题】:Julia : update mutable struct by matching it's name to value of DataFrame columnJulia:通过将可变结构的名称与 DataFrame 列的值匹配来更新可变结构
【发布时间】:2021-09-11 03:59:17
【问题描述】:

我想根据 DataFrame 中 id 列的值使用宏来改变一组可变结构中的一个,其中 id 列与结构的名称匹配。 我有一个返回从 MySQL 表创建的数据框的函数:

function groups()
    log = DBInterface.execute(con, "SELECT * FROM pgdb1.groups")
    df  = DataFrame(log)
    return df
end

这是数据框,它有 2 列,idpop

2×2 DataFrame
 Row │ id       pop     
     │ String   String
─────┼───────────────────
   1 │ yg_1     6
   2 │ jyg_1    4

我有 2 个结构,它们与这些 id 匹配,我想根据数据框的行更新它们:

mutable struct jyg_1
    pop::Int
end

mutable struct yg_1
    pop::Int
end

我有一个获取数据框的宏。基于该行的 id,我希望它更新与该行的 id 具有相同名称的结构。下面是一些伪代码,可以让您了解我的想法,但可能有更好的方法。

macro filter()
    for row ∈ eachrow(groups())      
#       if row.id == [ some element in a list of stringified structs ]
#       update the jyg_1 or yg_1 struct with group.pop
#   DBInterface.execute(con, "INSERT INTO pgdb1.groups (pop) VALUES ('$pop' );")
#       end
    end
end

我不确定是否有人可以推动我朝着正确的方向前进。感谢您考虑这个问题!

【问题讨论】:

  • 我不明白你为什么需要一个宏。您可以获得对象结构的名称为string(typeof(obj))。将此名称与数据框的 id 字段进行比较后,您可以使用普通语法 obj.pop = new_value 设置值。
  • 你会如何进行比较?
  • 如果你想更新结构,我假设你在某个集合中有这些结构的实例。这是对的吗?如果是这样,您可以遍历该集合并应用 string(typeof(obj)) == row.id

标签: julia


【解决方案1】:

您基本上需要将类名转换为Symbol,而不是eval,从而获得对象。我相信您不需要宏。

例如考虑df:

julia> df = DataFrame(id=["yg_1", "jyg_1"], pop=[4,6])
2×2 DataFrame
 Row │ id      pop
     │ String  Int64
─────┼───────────────
   1 │ yg_1        4
   2 │ jyg_1       6

你可以这样做:

julia> map.(eval.(Symbol.(df.id)), df.pop)
2-element Vector{Any}:
 yg_1(4)
 jyg_1(6)

这可能是你想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多