问题描述
我有一个非常大的数据框 (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)