@@ -77,39 +77,33 @@ type DataTable <: AbstractDataTable
77
77
if length (columns) == length (colindex) == 0
78
78
return new (Vector {Any} (0 ), Index ())
79
79
elseif length (columns) != length (colindex)
80
- throw (DimensionMismatch (" Number of columns ($(length (columns)) ) and column names ($(length (colindex)) ) are not equal" ))
80
+ throw (DimensionMismatch (" Number of columns ($(length (columns)) ) and number of column names ($(length (colindex)) ) are not equal" ))
81
81
end
82
- lengths = length .(columns)
82
+ lengths = [ isa (col, AbstractArray) ? length (col) : 1 for col in columns]
83
83
minlen, maxlen = extrema (lengths)
84
84
if minlen == 0 && maxlen == 0
85
85
return new (columns, colindex)
86
86
elseif minlen != maxlen
87
87
# recycle scalars
88
- if minlen == 1 && maxlen > 1
89
- indices = find (lengths .== minlen)
90
- for i in indices
91
- if ! (typeof (columns[i]) <: AbstractVector )
92
- columns[i] = fill (columns[i], maxlen)
93
- lengths[i] = maxlen
94
- end
95
- end
88
+ for i in 1 : length (columns)
89
+ typeof (columns[i]) <: AbstractArray && continue
90
+ columns[i] = fill (columns[i], maxlen)
91
+ lengths[i] = maxlen
96
92
end
97
- uniques = unique (lengths)
98
- if length (uniques ) != 1
99
- estring = Vector {String} (length (uniques))
93
+ uls = unique (lengths)
94
+ if length (uls ) != 1
95
+ # estring = Vector{String}(length(uniques))
100
96
strnames = string .(names (colindex))
101
- for (i,u) in enumerate (uniques)
102
- indices = find (lengths .== u)
103
- estring[i] = " column length ($(uniques[i]) ) for column(s) ($(join (strnames[indices], " , " )) )"
104
- end
97
+ estring = [" column length ($(uls[i]) ) for column(s) ($(join (strnames[find (uls .== u)], " , " )) )"
98
+ for (i,u) in enumerate (uls)]
105
99
throw (DimensionMismatch (join (estring, " is incompatible with " )))
106
100
end
107
101
end
108
102
for (i,c) in enumerate (columns)
109
103
if isa (c, Range)
110
104
columns[i] = collect (c)
111
105
elseif ! isa (c, AbstractVector)
112
- columns[i] = size (c, 2 ) > 1 ? throw (DimensionMismatch (" columns must be 1-dimensional" )) : [c]
106
+ columns[i] = size (c, 2 ) > 1 ? throw (DimensionMismatch (" columns must be 1-dimensional" )) : [c]
113
107
end
114
108
end
115
109
return new (columns, colindex)
@@ -120,21 +114,16 @@ function DataTable(; kwargs...)
120
114
if length (kwargs) == 0
121
115
return DataTable (Any[], Index ())
122
116
end
123
- colnames = Vector {Symbol} (length (kwargs))
124
- columns = Vector {Any} (length (kwargs))
125
- for (i,(k,v)) in enumerate (kwargs)
126
- colnames[i] = Symbol (k)
127
- columns[i] = v
128
- end
117
+ colnames = [Symbol (k) for (k,v) in kwargs]
118
+ columns = Any[v for (k,v) in kwargs]
129
119
DataTable (columns, Index (colnames))
130
120
end
131
121
132
122
function DataTable (columns:: AbstractVector ,
133
- cnames:: Vector {Symbol} = gennames (length (columns)))
134
- return DataTable (convert (Vector{Any}, columns), Index (cnames))
123
+ cnames:: AbstractVector {Symbol} = gennames (length (columns)))
124
+ return DataTable (convert (Vector{Any}, columns), Index (convert (Vector{Symbol}, cnames) ))
135
125
end
136
126
137
-
138
127
# Initialize empty DataTable objects of arbitrary size
139
128
function DataTable (t:: Type , nrows:: Integer , ncols:: Integer )
140
129
columns = Vector {Any} (ncols)
@@ -146,40 +135,41 @@ function DataTable(t::Type, nrows::Integer, ncols::Integer)
146
135
end
147
136
148
137
# Initialize an empty DataTable with specific eltypes and names
149
- function DataTable (column_eltypes:: Vector{DataType } , cnames:: Vector {Symbol} , nrows:: Integer )
138
+ function DataTable {T<:Type} (column_eltypes:: AbstractVector{T } , cnames:: AbstractVector {Symbol} , nrows:: Integer )
150
139
p = length (column_eltypes)
151
140
columns = Vector {Any} (p)
152
141
for j in 1 : p
153
- T = column_eltypes[j]
154
- columns[j] = T <: Nullable ? NullableArray {eltype(T )} (nrows) : Vector {T } (nrows)
142
+ colT = column_eltypes[j]
143
+ columns[j] = colT <: Nullable ? NullableArray {eltype(colT )} (nrows) : Vector {colT } (nrows)
155
144
end
156
- return DataTable (columns, Index (cnames))
145
+ return DataTable (columns, Index (convert (Vector{Symbol}, cnames) ))
157
146
end
147
+
158
148
# Initialize an empty DataTable with specific eltypes and names
159
149
# and whether a nominal array should be created
160
- function DataTable (column_eltypes:: Vector{DataType } , cnames:: Vector {Symbol} ,
161
- nominal:: Vector{Bool} , nrows:: Integer )
150
+ function DataTable {T<:Type} (column_eltypes:: AbstractVector{T } , cnames:: AbstractVector {Symbol} ,
151
+ nominal:: Vector{Bool} , nrows:: Integer )
162
152
p = length (column_eltypes)
163
153
columns = Vector {Any} (p)
164
154
for j in 1 : p
165
- T = column_eltypes[j]
155
+ colT = column_eltypes[j]
166
156
if nominal[j]
167
- columns[j] = T <: Nullable ? NullableCategoricalArray {T } (nrows) : CategoricalVector {T } (nrows)
157
+ columns[j] = colT <: Nullable ? NullableCategoricalArray {colT } (nrows) : CategoricalVector {colT } (nrows)
168
158
else
169
- columns[j] = T <: Nullable ? NullableArray {T } (nrows) : Vector {T } (nrows)
159
+ columns[j] = colT <: Nullable ? NullableArray {colT } (nrows) : Vector {colT } (nrows)
170
160
end
171
161
end
172
- return DataTable (columns, Index (cnames))
162
+ return DataTable (columns, Index (convert (Vector{Symbol}, cnames) ))
173
163
end
174
164
175
165
# Initialize an empty DataTable with specific eltypes
176
- function DataTable (column_eltypes:: Vector{DataType } , nrows:: Integer )
166
+ function DataTable {T<:Type} (column_eltypes:: AbstractVector{T } , nrows:: Integer )
177
167
p = length (column_eltypes)
178
168
columns = Vector {Any} (p)
179
169
cnames = gennames (p)
180
170
for j in 1 : p
181
- T = column_eltypes[j]
182
- columns[j] = T <: Nullable ? NullableArray {T } (nrows) : Vector {T } (nrows)
171
+ colT = column_eltypes[j]
172
+ columns[j] = colT <: Nullable ? NullableArray {colT } (nrows) : Vector {colT } (nrows)
183
173
end
184
174
return DataTable (columns, Index (cnames))
185
175
end
0 commit comments