Например, у меня есть DataFrame, как показано ниже, назовем его df.Writetable экспортирует данные с помощью «Nullable {Type} (data)» вместо данных в Julia
╔═════╦══════╦══════╦══════╗
║ Row ║ a ║ b ║ c ║
╠═════╬══════╬══════╬══════╣
║ 1 ║ 0.66 ║ 0.55 ║ 0.44 ║
╠═════╬══════╬══════╬══════╣
║ 2 ║ 0.11 ║ 0.22 ║ 0.33 ║
╠═════╬══════╬══════╬══════╣
║ 3 ║ 1.00 ║ 2.00 ║ 3.00 ║
╚═════╩══════╩══════╩══════╝
Когда я использую writetable («output.txt», ДФ) Я получаю следующий тип вывода для числовых данных в текстовом файле.
"Nullable {Float64} (0,66)"
вместо
0,66
Любые мысли о том, как получить writetable экспортировать только данные?
EDIT:
Я хотел бы отметить, что это происходит только после импорта данных с использованием пакета ReadStat. Можно ли преобразовать весь набор данных только в массив, который можно экспортировать правильно? Это может решить проблему.
EDIT # 2:
Я просто попытался запустить следующий код (используя созданную функцию converter
), но я ошибок приема (размещены ниже).
f(a,n)=
if typeof(a[n])==NullableArrays.NullableArray{String,1}
convert(Array{String},a[n])
elseif typeof(a[n])==NullableArrays.NullableArray{Float64,1}
convert(Array{Float64},a[n])
elseif typeof(a[n])==NullableArrays.NullableArray{Int64,1}
convert(Array{Float64},a[n])
end
converter(a)=hcat([f(a,n) for n=1:length(a)]...)
Ошибки, полученные следующим образом:
julia> converter(af)
ERROR: NullException()
in convert at /home/ale/.julia/v0.5/NullableArrays/src/primitives.jl:248 [inlined]
in convert(::Type{Array{Float64,N}}, ::NullableArrays.NullableArray{Float64,1}) at /home/ale/.julia/v0.5/NullableArrays/src/primitives.jl:256
in f(::DataFrames.DataFrame, ::Int64) at ./REPL[6]:5
in collect_to!(::Array{Array{T,1},1}, ::Base.Generator{UnitRange{Int64},##1#2{DataFrames.DataFrame}}, ::Int64, ::Int64) at ./array.jl:340
in collect_to!(::Array{Array{Float64,1},1}, ::Base.Generator{UnitRange{Int64},##1#2{DataFrames.DataFrame}}, ::Int64, ::Int64) at ./array.jl:350
in collect(::Base.Generator{UnitRange{Int64},##1#2{DataFrames.DataFrame}}) at ./array.jl:308
in converter(::DataFrames.DataFrame) at ./REPL[7]:1
Не знаете, как ReadStat меняет ситуацию, но вы можете попробовать получить свои столбцы и преобразовать их в обычные массивы с плавающей запятой: 'convert (Array {Float64}, df [: a])' и/или, возможно, воссоздать ваш DataFrame, используя эти нормальные массивы. Но да, если я просто создаю нормальный фреймворк с указанным выше содержимым и напишу его с помощью 'writetable', вывод кажется прекрасным. –
Я думаю, что я обнаружил проблему. Поскольку ReadStat использует пакет Nullable Arrays, он заменяет значения Null на #NULL. Эти значения не могут быть преобразованы. Функция конвертера, вышедшая выше, работает до тех пор, пока я не получу столбцы, где существуют значения #NULL. Я посмотрю, смогу ли я найти способ заменить их чем-то, что можно преобразовать либо в значение, либо просто с NA. Я попробовал 'replace (af [338], # NULL, NA)' где 338 - это столбец, в котором сначала появляется '# NULL', но я не могу выполнить код из-за' # '. –
ах, я вижу. '# NULL' предназначен только для визуального представления. Фактическое значение - 'Nullable {Float64}()'. Если вы выполните 'a = Nullable {Float64}()', вы увидите, что 'a.hasvalue' является ложным. В отличие от 'a = Nullable {Float64} (1.0)' где 'a.hasvalue' истинно, а' a.value' - '1.0'. Я недостаточно разбираюсь в массивах Nullable или Nullable, чтобы узнать, существует ли какой-либо конкретный метод, но должно быть очень просто использовать приведенное выше в понимании списка и заменить значения «null» (то есть, где 'hasvalue' является ложным) с идентификатором по вашему выбору, например NaN, чтобы вы могли написать таблицу. –