Dataframe 使用数据框后保持变量类型

Dataframe 使用数据框后保持变量类型,dataframe,julia,cluster-analysis,Dataframe,Julia,Cluster Analysis,我试图使用R packageclustMixType中的kproto()函数对Julia中的混合类型数据进行聚类,但是我在x中得到了错误没有数值变量!尝试使用包中的kmodes()。。我的数据应该有3个变量:2个连续变量和1个分类变量。似乎在我使用了DataFrame()之后,所有变量都变成了分类变量。在使用DataFrame()之后,有没有办法避免更改变量类型,这样我就可以使用混合类型的数据(连续的和分类的)来使用kproto() 我不知道关于R包的任何信息,也不知道它需要什么样的输入,但问题

我试图使用R package
clustMixType
中的
kproto()
函数对Julia中的混合类型数据进行聚类,但是我在x中得到了错误
没有数值变量!尝试使用包中的kmodes()。
。我的数据应该有3个变量:2个连续变量和1个分类变量。似乎在我使用了
DataFrame()
之后,所有变量都变成了分类变量。在使用
DataFrame()
之后,有没有办法避免更改变量类型,这样我就可以使用混合类型的数据(连续的和分类的)来使用
kproto()


我不知道关于R包的任何信息,也不知道它需要什么样的输入,但问题可能是如何构造数据矩阵,而不是数据帧构造函数本身

将数字列和字符串列连接在一起时,Julia将返回结果矩阵的元素类型
Any

julia> g1=hcat(x1,x2,x3)
10×3 Matrix{Any}:
  0.708309  -4.84767   "1"
  0.566883  -0.214217  "1"
...
这意味着您的
df0
矩阵是:

julia> #create the data
       df0=vcat(g1,g2)
20×3 Matrix{Any}:
  0.708309   -4.84767   "1"
  0.566883   -0.214217  "1"
...
DataFrame
构造函数只会传递这种类型信息的缺乏,而不是试图推断列类型

julia> DataFrame(df0)
20×3 DataFrame
 Row │ x1         x2         x3  
     │ Any        Any        Any 
─────┼───────────────────────────
   1 │ 0.708309   -4.84767   1
   2 │ 0.566883   -0.214217  1
...
解决此问题的一个简单方法是,不要将列连接到单个矩阵中,而是从列构造数据帧:

julia> DataFrame([vcat(x1, y1), vcat(x2, y2), vcat(x3, y3)])
20×3 DataFrame
 Row │ x1         x2          x3     
     │ Float64    Float64     String 
─────┼───────────────────────────────
   1 │  0.708309   -4.84767   1
   2 │  0.566883   -0.214217  1
...

如您所见,我们现在在生成的数据帧中有两个
Float64
数值列
x1
x2

作为Nils的漂亮答案的补充(因为问题确实是在矩阵构造时,而不是在
DataFrame
创建时),有以下小技巧:

julia> df = DataFrame([1 1.0 "1"; 2 2.0 "2"], [:int, :float, :string])
2×3 DataFrame
 Row │ int  float  string
     │ Any  Any    Any
─────┼────────────────────
   1 │ 1    1.0    1
   2 │ 2    2.0    2

julia> identity.(df)
2×3 DataFrame
 Row │ int    float    string
     │ Int64  Float64  String
─────┼────────────────────────
   1 │     1      1.0  1
   2 │     2      2.0  2
julia> df = DataFrame([1 1.0 "1"; 2 2.0 "2"], [:int, :float, :string])
2×3 DataFrame
 Row │ int  float  string
     │ Any  Any    Any
─────┼────────────────────
   1 │ 1    1.0    1
   2 │ 2    2.0    2

julia> identity.(df)
2×3 DataFrame
 Row │ int    float    string
     │ Int64  Float64  String
─────┼────────────────────────
   1 │     1      1.0  1
   2 │     2      2.0  2