Dataframe Writetable正在使用“导出数据”;可为空的{Type}(数据)";而不仅仅是Julia中的数据

Dataframe Writetable正在使用“导出数据”;可为空的{Type}(数据)";而不仅仅是Julia中的数据,dataframe,export,julia,Dataframe,Export,Julia,例如,我有一个如下所示的数据帧,我们称之为df ╔═════╦══════╦══════╦══════╗ ║ Row ║ a ║ b ║ c ║ ╠═════╬══════╬══════╬══════╣ ║ 1 ║ 0.66 ║ 0.55 ║ 0.44 ║ ╠═════╬══════╬══════╬══════╣ ║ 2 ║ 0.11 ║ 0.22 ║ 0.33 ║ ╠═════╬══════╬══════╬══════╣ ║ 3 ║ 1.00 ║ 2.00 ║ 3

例如,我有一个如下所示的数据帧,我们称之为df

╔═════╦══════╦══════╦══════╗
║ 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”,df)时,我收到文本文件中数字数据的以下类型的输出

“可为空的{Float64}(0.66)”

而不是

0.66

关于如何获得可写性以仅导出数据,您有什么想法吗

编辑:

我应该注意,只有在使用ReadStat包导入数据之后,才会发生这种情况。是否可以将整个数据集转换为可以正确导出的数组?这可能会解决问题

编辑#2:

我刚刚试着运行下面的代码(使用创建的函数
converter
),但收到错误(发布在下面)

converter(a)=hcat([f(a,n)表示n=1:长度(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

看/玩一看以下内容:

julia>使用数据帧
julia>a=[Nullable(0.1),Nullable{Float64}(),Nullable(0.3)];
julia>b=[Nullable{Float64}(),Nullable(2.),Nullable(3.);
julia>df=DataFrame(任意[a,b],:a,:b])
3×2数据帧。数据帧
│ 一行│ A.│ B│
├─────┼───────┼───────┤
│ 1.│ 0.1│ #无效的│
│ 2.│ #无效的│ 2│
│ 3.│ 0.3│ 3│
julia>c=[df[x]表示名称中的x(df)];
julia>f(x)=[get(y,“Missing”)表示x中的y];
julia>d=c中x的任意[f(x);#数据帧需要“Any”(我想)
julia>df2=数据帧(d,名称(df))
│ 一行│ A.│ B│
├─────┼───────────┼───────────┤
│ 1.│ 0.1│ “失踪”│
│ 2.│ “失踪”│ 2│
│ 3.│ 0.3│ 3│
julia>writetable(“/home/tasos/Desktop/output.txt”,df2)
请注意,对于每一列,如果缺少一个值,由于混合数组,您的数字也将在引号中报告。如果希望它是所有整数,则必须选择不同的默认值“Missing”来表示缺少的值(例如,如果只需要正数,则为-1)

如果您不喜欢,那么您最好编写自己的“writetable”函数;这并没有那么困难,只是打开一个文件,然后在每一列中打印您想要的内容


此外,为了解决我们在评论中的一些讨论:

可为空的类型有两个字段:

julia>字段名(可空)
二元数组{符号,1}:
:hasvalue
:价值
让我们创建两个实例来说明它们的含义:

julia>a=Nullable(1,true);b=可为空(2,false);
朱莉娅>a.hasvalue,a.value
(对,1)
julia>b.hasvalue,b.value
(错,2)
您可以显式测试空值:

julia>isnull(a)
假的
julia>isnull(b)
真的
julia>isnull(0),isnull(“”)
(false,false)#如果输入不是可为null的类型,则默认情况下isnull返回false
或者可以使用“get”函数获取可为null的值。如果在null的情况下未定义替代项,则会得到一个NullException:

julia>get(a)
1.
朱莉娅>得到(b)
错误:NullException()
堆栈跟踪:
[1] 在./Nullable.jl:92获取(::Nullable{Int64})
julia>get(b,“检测到空”)
“检测到空值”
定义为
Nullable(1,false)
的可空实例的
.value
值为1,但这是多余的,因为它被声明为
.hasvalue=false
,因此实际上是空的(如果您确实想查询
.value

定义为
n=Nullable{Float64}()
的可空实例将为您提供一个具有
.hasvalue=false
和一个无意义的值的可空实例,该值可能是实例化期间该位置内存中的任何值,尽管解释为您声明的任何类型的可空实例(即Float64):

julia>n=Nullable{Float64}()
可为空的{Float64}()
朱莉娅>n.hasvalue,n.value
(假,6.9015724352651e-310)

不确定ReadStat如何更改内容,但您可以尝试获取列并将其转换为普通浮点数组:
转换(数组{Float64},df[:a])
和/或可能使用这些普通数组重新创建数据帧。但是是的,如果我只是用上面的内容创建一个普通的数据帧,然后用
writetable
将其写出来,输出似乎很好。我想我已经发现了问题。由于ReadStat使用可空数组包,因此它将空值替换为#Null。无法转换这些值。我在上面发布的转换器函数在我到达存在#NULL值的列之前一直有效。我将看看是否能找到一种方法,用可以转换为值或NA的东西来替换这些。我尝试了
replace(af[338],#NULL,NA)
其中338是第一次出现
#NULL
的列,但由于
#
的原因,我无法执行代码。啊,我明白了
#NULL
仅用于视觉表示。实际值是
Nullable{Float64}()
。如果执行
a=Nullable{Float64}()
操作,您将看到
a.hasvalue
为false。而不是说
a=Nullable{Float64}(1.0)
其中
a.hasvalue
为真,
a.value
1.0
。我对Nullable或Nullable数组不太熟悉,不知道是否有特定的方法,但在列表理解中使用上述方法应该很容易,并用您选择的标识符替换“null”值(即,
hasvalue
为false),例如NaN,因此,您可以编写table.NullableArray的文档非常棒,我今晚将对此进行研究!你是个天才。我修改了一下我的方式,我使用了
f(x)=[get(y,NA)表示x中的y]而不是
f(x)=[get(y,“Missing”)表示x中的y]。这允许我使用DataArrays.NAtype的值,而不是conv
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