【发布时间】:2016-02-19 21:42:07
【问题描述】:
我有一个大型数据集,在 R 中阻塞了 split()。我可以使用 dplyr group_by(无论如何这是一种首选方式),但我无法将生成的 grouped_df 持久化为数据框列表,我的连续处理步骤所需的格式(我需要强制转换为 SpatialDataFrames 和类似的格式)。
考虑一个示例数据集:
df = as.data.frame(cbind(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2)))
listDf = split(df,df$V1)
返回
$a
V1 V2 V3
1 a 1 2
2 a 2 3
$b
V1 V2 V3
3 b 3 4
4 b 4 2
$c
V1 V2 V3
5 c 5 2
我想用group_by(类似于group_by(df,V1))来模拟它,但这会返回一个grouped_df。我知道do 应该能够帮助我,但我不确定用法(另请参阅link 进行讨论。)
请注意,split 使用已用于建立此组的因素的名称来命名每个列表 - 这是一个理想的功能(最终,对于从 dfs 列表中提取这些名称的方法,这是一种额外的荣誉)。
【问题讨论】:
-
为什么
group_by比split更受欢迎?因为它是哈德利写的?group_by有它的位置,它不是为了将数据集拆分为不同的数据帧而设计的,而split旨在实现这一点。 -
不,不是因为它是由 hadley 编写的,而是因为它完成了——而且速度很快。我有一个 df 为 400mb 的数据集,拆分会导致怪物(不知道为什么它会扩大大小),并在保存时使 R 崩溃。这是一个训练数据集,真正的数据集是 8.5GB 数据集(1GB 作为 RData)。组工作,分裂失败。我尝试了 bigsplit,但也没能成功。仍然,回到问题 - 如何使用 group_by (和 dplyr)做到这一点?
-
再次重申,
group_by并非旨在将数据集拆分为单独的数据集。do可能会比split慢得多。split是完全矢量化和编译的函数,我不明白为什么它会比任何其他替代方案慢。 -
所以我假设你有一些函数说
f(),你想应用于你的data.frames列表中的每个data.frame(由split生成)。如果是这种情况,替代的 dplyr-route(不拆分)将类似于df %>% group_by(V1) %>% do(f(.))假设f()返回一个 data.frame。否则你可能需要df %>% group_by(V1) %>% do(data.frame(f(.)))之类的东西。如果您真的想创建一个列表,请坚持使用split,正如 David 所评论的那样。 -
你是对的。我需要应用一个生成完全不同对象的函数 - SpatialDataFrame。因此,我假设在工作流程的这个阶段,我必须“退出” dplyr 工作流程。因此,我想要一个 dfs 列表,稍后我可以遍历并做我需要的任何事情。我尝试了一个简单的 hack
%>% do(as.data.frame(.))但这不起作用(而且我不知道如何让每个组附加到一个大的list()。欢迎提示。我尝试了类似:xx<- group_by(df,V1) %>% do(data.frame(function(x) {coordinates(x)=(~V2+V3)}))其中coordinates来自@ 987654350@