Nic*_*ick 2 string types boolean julia
我想将"是"/"否"的字符串数组转换为布尔类型.
起初,我检查是否存在NAs:
convert(Array, datsub[:s734y])哪些不起作用,所以有NAs所以我将NAs转换为"No"
datsub[isna(datsub[:s734y]),:s734y] = "No"
然后这工作:
map(s->s==""||s=="NA" ? "No" : s, datsub[:s734y])所以我有点肯定(也是从查看数据集)我只有"是"/"否"值
我将它转换为布尔值的代码是:
convert(Vector{Bool}, map(q-> tryparse(Bool, q), datsub[:s734y]))
返回Inexact Error
知道为什么我的代码错了吗?
附录:类型转换在这一点上对我来说是一种普遍的挫败感.
如果没有可重复的示例,很难遵循您的工作,但您可以执行以下操作:
julia> q = ["yes", "no"]
julia> parsebool(s::String) = lowercase(s) == "yes" ? true: false
julia> qbool = Bool[parsebool(x) for x in q]
2-element Array{Bool,1}:
true
false
Run Code Online (Sandbox Code Playgroud)
虽然比使用内置函数稍微多一点,但您还可以为作为字符串遇到的每种类型的值定义自定义逻辑.我使用了三元运算符,所以我假设你只是"是"/"不".但是,对于您可能接受的任何字符串值系列,可以轻松扩展此示例if/elseif/else.
Randy的答案非常适合强大而强大的东西(例如,它可以处理大小写和/或小写的值).对于快速和脏的东西,只要你有一个"干净"的数组开始工作(例如没有大写的问题等),你可以使用这个:
Array1 = ["Yes", "Yes", "No", "No", "Yes"];
Array2 = Array1 .== "Yes"
5-element BitArray{1}:
true
true
false
false
true
Run Code Online (Sandbox Code Playgroud)
对.==Array1中的每个元素进行元素逻辑比较,看它是否等于"是".
注意:如果你真的想要Bools而不是BitArray,那么你可以使用:
Array2 = convert(Array{Bool}, Array1 .== "Yes")
Run Code Online (Sandbox Code Playgroud)
在许多情况下,Bool和BitArray在很大程度上是可以互换的,功能非常相似.有关这些类型之间的差异和相似之处的一些信息,请参阅(Julia中的Array {Bool}和BitArray之间有什么区别?它们是如何相关的?)