2016-06-16 10 views
2

Ich möchte ein Array von Strings von "Ja"/"Nein" in booleschen Typ konvertieren.Konvertieren von String zu Boolean in Julia

Zunächst überprüfte ich, ob es NAs waren anwesend: convert(Array, datsub[:s734y]) die funktionierte nicht, so dass es NAs waren Also ich die NAs umgewandelt "Nein" datsub[isna(datsub[:s734y]),:s734y] = "No"

und dann das funktionierte: map(s->s==""||s=="NA" ? "No" : s, datsub[:s734y]) so bin ich etwas sicher (auch aus der Betrachtung der Daten-Set), dass ich nur haben „ja“/„nein“ Werte

Mein Code es in Boolean konvertiert wird: convert(Vector{Bool}, map(q-> tryparse(Bool, q), datsub[:s734y])) Welche kehrt Inexact Error

Irgendeine Idee, warum mein Code falsch ist?

Addendum: Typumwandlung ist eine allgemeine Frustration für mich an dieser Stelle.

Antwort

5

Die Antwort von Randy ist großartig für etwas, das stark und robust ist (z. B. dass es die Werte für Groß- und/oder Kleinschreibung verarbeiten kann). Für etwas schnell und schmutzig, die so lange wie Sie eine „saubere“ Array arbeiten zu beginnen (zB keine Probleme mit Kapitalisierung, etc.) Sie diese nur verwenden können:

Array1 = ["Yes", "Yes", "No", "No", "Yes"]; 
Array2 = Array1 .== "Yes" 

5-element BitArray{1}: 
    true 
    true 
false 
false 
    true 

die .== tut ein Element- kluger logischer Vergleich jedes Elements in Array1, um zu sehen, ob es "Ja" ist.

Hinweis: Wenn Sie wirklich Bools wollen, anstatt eine BitArray, da dies gibt, dann können Sie verwenden:

Array2 = convert(Array{Bool}, Array1 .== "Yes") 

In vielen Fällen Bool und BitArray sind weitgehend austauschbar und ganz ähnlich funktionieren. Für einige Informationen über die Unterschiede und Ähnlichkeiten zwischen diesen Typen, siehe (What's the difference between Array{Bool} and BitArray in Julia and how are they related?)

7

Es ist schwer zu folgen, was Sie ohne reproduzierbares Beispiel tun, aber Sie können wie die etwas tun folgend:

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 

Während etwas mehr Arbeit als mit einer eingebauten Funktion können Sie auch eigenen definieren Logik für jede Art von Wert, den Sie als Zeichenfolge begegnen. Ich habe den ternären Operator verwendet, also nehme ich an, Sie hätten nur "Ja"/"Nein". Aber dieses Beispiel könnte leicht für jede Reihe von Zeichenfolgenwerten erweitert werden, die Sie unter Verwendung von if/elseif/else akzeptieren könnten.

+0

Dank @RandyZwitch, ich endete mit Aireties-Code, weil es ein bisschen einfacher war, aber ich werde zu Ihnen für zukünftige Konvertierungen zurückkehren! – Nick