Dataframe 将子数据帧转换为数据帧?
我有一个创建子数据帧的Dataframe 将子数据帧转换为数据帧?,dataframe,julia,Dataframe,Julia,我有一个创建子数据帧的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:
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(sdf)
就足够了,其中sdf
是子数据帧。它将创建所有向量的副本
以下是一个解决方案,它将创建一个数据框
,其中包含子数据框
中所有向量的视图
(它应该在主版本和当前标记的版本上都有效):
(我使用AbstractVector
容器类型,因为它在当前主机上会更快)
当数据框至少包含一个视图
列时,您将无法向该数据框添加行
编辑:作为旁注(也许这最终是你的问题)。如果您有sdf
这是一个子数据框
,它的父项是df
这是一个数据框
,那么如果您向df
添加列,它们将立即在sdf
中可见,因为子数据框
仅选择行并从父项继承所有列。次要问题:您真的这样做吗是否需要在
中添加列?这听起来很不寻常。您只需返回带有新列的DataFrame
,并让它们与最后的分组列自动组合。@MilanBouchet Valat您是正确的。这是没有必要的。
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