Thanks for reporting -- it is a bug. Having a Array or DataArray with NAtype as its eltype is a little awkward. Here's why it's causing you trouble, and a couple alternatives:
using DataFrames
nrows = 3
a = DataFrame(A = 1:nrows)
# Column :A is all NA for all of these cases
b1 = DataFrame(A = fill(NA, nrows))
b2 = DataFrame(A = DataArray(Int, nrows))
b3 = DataFrame(A = DataArray(None, nrows))
vcat(a, b1) # ERROR: no method matching convert(::Type{Int64}, ::DataArrays.NAtype)
vcat(a, b2) # okay
vcat(a, b3) # okay
It should probably work as is (if not, I guess the promotion rules should change, and the result should be of type Any or there should be a more informative error).
I opened an issue:
https://github.com/JuliaStats/DataArrays.jl/issues/134, but given that most interested developers are focused on coming up with an replacement for DataArrays and NAtype, it may not get attention at the moment, so I'd avoid creating that ambiguous array if possible for now.
For your other question, conversion of columns, you'll generally use functions from Base Julia or DataArrays.jl to transform data however you like.
Categorical variables are (for the moment) represented using PooledDataArrays, so:
pdata(abstract_array) or convert(PooledDataArray, abstract_array)
And for strings:
map(string, abstract_array) or convert(some_string_type, abstract_array)