我是Julia的新手,所以对不起,这是一个基本问题。
假设我们有一个字典和一个键向量:
X = [2, 1, 1, 3]
d = Dict( 1 => "A", 2 => "B", 3 => "C")
我想创建一个新数组,其中包含值而不是键(根据字典),因此最终结果将类似于
Y = ["B", "A", "A", "C"]
我想我可以遍历向量元素,在字典中查找它并返回相应的值,但这对我来说似乎效率很低。 像
Y = Array{String}(undef, length(X))
for i in 1:length(X)
Y[i] = d[X[i]]
end
编辑:此外,如果X
包含missing
个值,我提出的解决方案将不起作用。
所以我的问题是,是否有某种更有效的方法(我正在使用更大的数组和字典来完成),或者这是否是一种合适的方法?
答案 0 :(得分:6)
效率在不同的上下文中可能意味着不同的事情,但我可能会这样做:
Y = [d[i] for i in X]
如果X
包含missing
个值,则可以在理解中使用skipmissing(X)
。
答案 1 :(得分:5)
您可以使用数组理解来简洁地完成此操作:
julia> [d[x] for x in X]
4-element Array{String,1}:
"B"
"A"
"A"
"C"
将来可能会写d.[X]
来更简洁地表达这一点,但是从Julia 1.3开始,这是不允许的。
根据对问题的编辑,假设missing
中某处有一个X
值:
julia> X = [2, 1, missing, 1, 3]
5-element Array{Union{Missing, Int64},1}:
2
1
missing
1
3
如果要将missing
映射到missing
或其他类似字符串"?"
的值,则可以像这样明确地做到这一点:
julia> [ismissing(x) ? missing : d[x] for x in X]
5-element Array{Union{Missing, String},1}:
"B"
"A"
missing
"A"
"C"
julia> [ismissing(x) ? "?" : d[x] for x in X]
5-element Array{String,1}:
"B"
"A"
"?"
"A"
"C"
如果您打算做很多事情,将missing
放在字典中可能会更容易,例如:
julia> d = Dict(missing => "?", 1 => "A", 2 => "B", 3 => "C")
Dict{Union{Missing, Int64},String} with 4 entries:
2 => "B"
missing => "?"
3 => "C"
1 => "A"
julia> [d[x] for x in X]
5-element Array{String,1}:
"B"
"A"
"?"
"A"
"C"
如果您只想跳过缺失的值,则可以使用skipmissing(X)
代替X
:
julia> [d[x] for x in skipmissing(X)]
4-element Array{String,1}:
"B"
"A"
"A"
"C"
通常没有一种正确的方法来处理缺失值,这就是为什么您需要显式编码如何处理缺失数据的原因。