Превратить SubDataFrame в DataFrame? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть by, который создает SubDataFrames.Как мне превратить их в DataFrame, желательно без копирования?

Моя первоначальная проблема заключается в том, что я не могу добавить новый столбец в SubDataFrame:

# df[:End] = 1:nrow(merged_islands)
# ERROR: LoadError: Cannot assign to non-existent column: End

# insert!(df, length(df), Array(1:nrow(merged_islands)), :End)
# ERROR: LoadError: MethodError: no method matching insert!(::SubDataFrame{Array{Int64,1}}, ::Int64, ::Array{Int64,1}, ::Symbol)

Я предполагаю, что преобразование его в DataFrame - самый простой способ сделать это:)

1 Ответ

0 голосов
/ 25 сентября 2018

интересный вопрос.На текущем мастере (который будет помечен очень скоро) достаточно написать DataFrame(sdf), где sdf - это SubDataFrame.Однако будет создана копия всех векторов.

Вот решение, которое создаст DataFrame с view из всех векторов, содержащихся в SubDataFrame (он должен работать как на главном, так и на текущемпомеченный выпуск):

function sdf2df(sdf::SubDataFrame)
    p = parent(sdf)
    sel = DataFrames.rows(sdf)
    DataFrame(AbstractVector[view(p[i], sel) for i in 1:ncol(sdf)],
              names(sdf))
end

(я использую AbstractVector тип контейнера, так как он будет быстрее на текущем мастере)

Вы не сможете добавлять строки к такому DataFrameв то время как он содержит по крайней мере один столбец view.

РЕДАКТИРОВАТЬ: в качестве примечания (возможно, это была ваша проблема в конце).Если у вас есть sdf, который является SubDataFrame, чьим родителем является df, который является DataFrame, тогда, если вы добавите столбцы к df, они будут сразу же видны в sdf, так как SubDataFrame выбирает только строки инаследует все столбцы от родителя.

...