модуль). Теперь я включил в него ответ Dan Getz, поэтому я могу просто прочитать таблицу шансов как
приятная особенность DataFrames состоит в том, что он может хранить столбцы с различными типами и может автоматически распознавать их, например:
using DataFrames, DataStructures
df1 = wsv"""
parName region forType value
vol AL broadL_highF 3.3055628012
vol AL con_highF 2.1360975151
vol AQ broadL_highF 5.81984502
vol AQ con_highF 8.1462998309
"""
typeof(df1[:parName])
DataArrays.DataArray{String,1}
typeof(df1[:value])
DataArrays.DataArray{Float64,1}
Однако, когда я пытаюсь достичь того же результата, начиная с матрицы (импортированной из электронной таблицы), я «теряю» это автоматическое преобразование:
dataMatrix = [
"parName" "region" "forType" "value";
"vol" "AL" "broadL_highF" 3.3055628012;
"vol" "AL" "con_highF" 2.1360975151;
"vol" "AQ" "broadL_highF" 5.81984502;
"vol" "AQ" "con_highF" 8.1462998309;
]
h = [Symbol(c) for c in dataMatrix[1,:]]
vals = dataMatrix[2:end, :]
df2 = convert(DataFrame,OrderedDict(zip(h,[vals[:,i] for i in 1:size(vals,2)])))
typeof(df2[:parName])
DataArrays.DataArray{Any,1}
typeof(df2[:value])
DataArrays.DataArray{Any,1}
Есть несколько вопросов о С.О. о том, как преобразовать матрицу в Dataframe (например,DataFrame из массива с заголовком, Конвертировать массив Julia в dataframe), но ни один из ответов не касается преобразования матрицы смешанного типа.
Как я могу создать DataFrame из матрицы, автоматически распознающей тип столбцов?
РЕДАКТИРОВАТЬ: Ясделал тест три решения: (1) преобразовать df (используя словарь или матричный конструктор .. сначала быстрее), а затем применить try-catch для преобразования типов (мой оригинальный ответ); (2) преобразовать в строку и затем использовать df.inlinetable (ответ Дана Гетца); (3) проверьте тип каждого элемента и их согласованность по столбцам (ответ Александра Морли).
Вот результаты:
# second time for compilation.. further times ~ results
@time toDf1(m) # 0.000946 seconds (336 allocations: 19.811 KiB)
@time toDf2(m) # 0.000194 seconds (306 allocations: 17.406 KiB)
@time toDf3(m) # 0.001820 seconds (445 allocations: 35.297 KiB)
Так что, как ни странно, самое эффективное решение, похоже, «выливает воду» и сводит проблему к уже решенной ;-)
Спасибо за все ответы.