在Julia中从字符串转换为布尔值

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

知道为什么我的代码错了吗?

附录:类型转换在这一点上对我来说是一种普遍的挫败感.

Ran*_*tch 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
Run Code Online (Sandbox Code Playgroud)

虽然比使用内置函数稍微多一点,但您还可以为作为字符串遇到的每种类型的值定义自定义逻辑.我使用了三元运算符,所以我假设你只是"是"/"不".但是,对于您可能接受的任何字符串值系列,可以轻松扩展此示例if/elseif/else.


Mic*_*gge 5

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之间有什么区别?它们是如何相关的?)