在朱莉娅中使用人行横道翻译数据框

问题描述

我有一个非常大的数据框 (original_df) 和代码

14 15
21 22
18 16

第二个数据框(crosswalk)将“old_codes”映射到“new_codes”

14 104
15 105
16 106
18 108
21 201
22 202

当然,我想要的结果 df (resultant_df) 会有值:

104 105
201 202
108 106

我知道有两种方法可以做到这一点。首先,我可以遍历 original_df 中的每个代码,找到 crosswalk 中的代码,然后用 crosswalk 中的翻译代码重写 original_df 中对应的单元格。更快、更自然的选择是 leftjoin() 'old_codes' 上 original_df 的每一列。不幸的是,我似乎必须为每一列分别执行此操作,然后在创建其转换列后删除每一列——这感觉不必要地复杂。有没有更简单的方法可以使用人行横道一次转换所有 original_df ?

解决方法

您可以执行以下操作(我使用的是列号,因为您没有提供列名):

d = Dict(crosswalk[!,1] .=> crosswalk[!,2])
resultant_df = select(original_df,[i => ByRow(x -> d[x]) for i in 1:ncol(original_df)],renamecols=false)