将子数据框转换为数据框?

3

我有一个by函数,可以创建子数据框。如何将它们转换为数据框,最好不复制?

我的原始问题是无法向子数据框添加新列:

# 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是最简单的方法 :)

旁边的问题:您真的需要在“by”内添加列吗?这对我来说听起来很不寻常。您可以返回一个带有新列的“DataFrame”,并在最后自动将它们与分组列组合。 - Milan Bouchet-Valat
@MilanBouchet-Valat 你是正确的。这并不是必要的。 - The Unfun Cat
1个回答

3
一个有趣的问题。在当前主分支上(很快就要标记了),只需写入DataFrame(sdf),其中sdf是一个SubDataFrame。尽管如此,它会创建所有向量的副本。
以下是一种解决方案,它将创建一个包含SubDataFrame中所有向量的viewDataFrame (它应该在主分支和目前已发布的版本上都可以使用):
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,它是一个父级为df(一个DataFrame)的SubDataFrame,那么如果你向df添加列,则会立即在sdf中显示,因为SubDataFrame仅选择行并从父级继承所有列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接