我有一个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是最简单的方法:)
答案 0 :(得分:2)
一个有趣的问题。在当前的主服务器上(很快将被标记),只要写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
,它们将立即在{ {1}}和sdf
一样,仅选择行并从父级继承所有列。