我想将“是”/“否”的字符串数组转换为布尔类型。
首先,我检查了是否存在NAs:
convert(Array, datsub[:s734y])
哪些不起作用,所以有NAs
所以我将NAs转换为“否”
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
知道为什么我的代码错了吗?
附录:此时类型转换对我来说是一种普遍的挫败感。
答案 0 :(得分:7)
如果没有可重复的示例,很难关注您的工作,但您可以执行以下操作:
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
虽然比使用内置函数稍微多一些工作,但您还可以为作为字符串遇到的每种类型的值定义自定义逻辑。我使用了三元运算符,所以我假设你只是“是”/“不”。但是,对于您可能使用if/elseif/else
接受的任何字符串值系列,可以轻松扩展此示例。
答案 1 :(得分:5)
Randy的答案非常适合强大而强大的功能(例如,可以处理大小写和/或小写值)。对于快速和脏的东西,只要你有一个“干净”的数组开始工作(例如没有大写的问题等),你可以使用它:
Array1 = ["Yes", "Yes", "No", "No", "Yes"];
Array2 = Array1 .== "Yes"
5-element BitArray{1}:
true
true
false
false
true
.==
对Array1中的每个元素进行逐元素逻辑比较,以查看它是否等于“是”。
注意:如果您真的想要Bools而不是BitArray,那么您可以使用:
Array2 = convert(Array{Bool}, Array1 .== "Yes")
在许多情况下,Bool和BitArray在很大程度上是可以互换的,功能非常相似。有关这些类型之间差异和相似之处的一些信息,请参阅(What's the difference between Array{Bool} and BitArray in Julia and how are they related?)