String 朱莉娅:如何将字符串类型的向量转换为数字类型(Float64)

String 朱莉娅:如何将字符串类型的向量转换为数字类型(Float64),string,vector,type-conversion,character,julia,String,Vector,Type Conversion,Character,Julia,在Julia 1.1中,我想将string类型的向量转换为numeric类型(Float64) 这是向量: string = ["2.2", "3,3", "4.4"]; 我尝试了下面这句话,但没有成功: x = convert(Float64, string) x = convert(DataVector{Float64}, string) x = map(x->parse(Float64,x),string) x = parse(Float64,string) x = Float64

Julia 1.1
中,我想将string类型的向量转换为numeric类型(Float64) 这是向量:

string = ["2.2", "3,3", "4.4"];
我尝试了下面这句话,但没有成功:

x = convert(Float64, string)
x = convert(DataVector{Float64}, string)
x = map(x->parse(Float64,x),string)
x = parse(Float64,string)
x = Float64(string)
最简单的是:

julia> s = ["2.2", "3.3", "4.4"];

julia> parse.(Float64, s)
3-element Array{Float64,1}:
 2.2
 3.3
 4.4
但是
map
也会起作用:

julia> map(x->parse(Float64,x), s)
3-element Array{Float64,1}:
 2.2
 3.3
 4.4
原始示例中的问题有两个:

  • 第二个字符串
    “3,3”
    是无效的
    Floa64
    数字(它有一个错误的十进制分隔符)
  • 虽然有效,但我建议您不要使用
    string
    作为变量的名称,因为它会使
    string
    函数从基函数中黯然失色
此外,如果原始字符串以逗号作为十进制分隔符,则可以首先对其运行
replace
,例如,在这里,我通过向量广播它:

julia> s = ["2.2", "3,3", "4,4"];

julia> replace.(s, [','=>'.'])
3-element Array{String,1}:
 "2.2"
 "3.3"
 "4.4"
编辑:如图所示,写入eiter实际上要快一点:

replace.(s, (','=>'.',))

一般规则是,您之所以进行广播,是因为您使用了
,所以所有参数都应该是可广播的。因为
,在我们的例子中,
,'=>'.
,不被视为可广播的,所以我们必须将其包装在可广播的单元素容器中

第一种方法是使用
[
]
将其包装在一个元素数组中,这有点低效,因为它分配了一个新的临时数组

您可以使用一个元素元组将其包装在
,)
(请注意
前面的逗号)
,没有它,模式将无法正常工作)。这种方法不会分配内存

最后,您可以使用一个内置的
Ref
函数,它将创建一个类型为
Base.RefValue{Pair{Char,Char}}
的对象,在这种情况下,Julia将其视为一个0维的单元素容器(这是一个更高级的主题,您可以在Julia手册的部分中开始探索)。这种方法也不会分配内存

Julia手册中描述了您可以广播的内容

其他案件: 字符串和缺失的数组

为此,您需要最新的Missings.jl(在包管理器中运行
up
命令):

字符串数组和
NaN

这在实践中不应该发生,因为在一个向量中缺少字符串和浮动,但您可以这样做(我在向量中添加了
5.5
,以显示解决方案不是
NaN
特定的,但通常可以接受任何字符串或任何
Float64
):


非常感谢@BogumiłKamiński给出非常明确的答案。实际上,我刚刚在我真正的问题上尝试了一下:在数据帧上,我有一个类型为
s=[“2.2”、“3.3”、“4.4”,缺少]
的列。有没有办法将字符串
s
转换为
Float64
(如果我有
s=[“2.2”,“3.3”,“4.4”,NaN]
),答案会是相同的吗?我已经在答案中添加了处理这些情况的示例。非常感谢@BogumiłKamiński。带有
NaN
的示例工作得很好,但是,在安装了
Missings
之后,使用Missings键入
,然后
s=[“2.2”、“3.3”、“4.4”,missing]
passmissing(parse)。(Float64,s)
,我得到
UndefVarError:passmissing未定义的Stacktrace:[1]无的顶级作用域:0
非常细微的挑剔:在
replace.(s,[','=>'.]]
或元组中包装replace对不是更好,而不是分配向量?虽然性能差异很小,但我相信使用
Ref
是正常的建议。我可以理解这一点。尽管元组应该尽快引入,因为它们到处都有。
replace.(s, Ref(','=>'.'))
julia> s = ["2.2", "3.3", "4.4", missing]
4-element Array{Union{Missing, String},1}:
 "2.2"
 "3.3"
 "4.4"
 missing

julia> passmissing(parse).(Float64, s)
4-element Array{Union{Missing, Float64},1}:
 2.2
 3.3
 4.4
  missing
julia> s = ["2.2", "3.3", "4.4", NaN, 5.5]
5-element Array{Any,1}:
    "2.2"
    "3.3"
    "4.4"
 NaN
   5.5

julia> [v isa Float64 ? v : parse(Float64, v) for v in s]
5-element Array{Float64,1}:
   2.2
   3.3
   4.4
 NaN
   5.5