代码之家  ›  专栏  ›  技术社区  ›  The Unfun Cat

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

  •  1
  • The Unfun Cat  · 技术社区  · 6 年前

    我有一个 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)
    

    我猜把它转换成数据帧是最简单的方法。)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bogumił Kamiński    6 年前

    一个有趣的问题。在当前的主控形状上(很快就会被标记),它足以写入 DataFrame(sdf) 在哪里? sdf 是一个 SubDataFrame . 不过,它将创建所有向量的副本。

    下面是一个解决方案,它将创建一个 DataFrame 用一个 view 包含在 子数据帧 (它应该在主版本和当前标记的版本上都有效):

    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 容器类型,因为它在当前主控形状上更快)

    您将无法将行添加到 数据文件 它至少能容纳一个 看法 列。

    编辑:作为旁注(也许这最终是你的问题)。如果你有 SDF 哪个是 子数据帧 谁的父母是 df 哪个是 数据文件 然后,如果将列添加到 东风 它们将立即在 SDF 作为 子数据帧 只选择行并继承父级中的所有列。