- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑 data.frame 上的标准分组操作:
library(plyr)
library(doMC)
library(MASS) # for example
nc <- 12
registerDoMC(nc)
d <- data.frame(x = c("data", "more data"), g = c("group1", "group2"))
y <- "some global object"
res <- ddply(d, .(g), function(d_group) {
# slow, complicated operations on d_group
}, .parallel = FALSE)
只需编写 .parallel = TRUE
即可轻松利用多核设置。这是我最喜欢的 plyr 功能之一。
但是随着 plyr 被弃用(我认为)并基本上被 dplyr、purrr 等取代,并行处理的解决方案变得更加冗长:
library(dplyr)
library(multidplyr)
library(parallel)
library(MASS) # for example
nc <- 12
d <- tibble(x = c("data", "more data"), g = c("group1", "group2"))
y <- "some global object"
cl <- create_cluster(nc)
set_default_cluster(cl)
cluster_library(cl, packages = c("MASS"))
cluster_copy(cl, obj = y)
d_parts <- d %>% partition(g, cluster = cl)
res <- d_parts %>% collect() %>% ungroup()
rm(d_parts)
rm(cl)
您可以想象这个示例需要多长时间,考虑到循环内所需的每个包和对象都需要其自己的 cluster_* 命令将其复制到节点上。非并行化的 plyr 到 dplyr 转换只是一个简单的 dplyr::group_by 构造,不幸的是没有简洁的方法来启用并行处理。所以,我的问题是:
最佳答案
我认为没有一种真正的“首选”方法可以将 {plyr} 代码转换为 {dplyr}。
在评论中,@Aurèle 在描述 {plyr} 和 {doMC} 之间的联系方面比我做得更好。发生的一件事是激励措施发生了一些变化。 {doMC} 来自 Revolution Analytics(已被 Microsoft 收购)。但 dplyr 的开发者 Hadley 目前在 RStudio 工作。这两家公司在 IDE 领域展开竞争。因此,他们的软件包的设计不能很好地协同工作,这也许是很自然的。我看到 RStudio 强烈支持的唯一并行形式是 {sparklyr},他们使其设置相对“容易”。但是,我真的不建议使用 Spark 为单台机器进行并行处理。
@Aurèle 再次很好地解释了执行差异。您的新代码使用 PSOCK 集群,旧代码使用 fork 。 fork 使用写时复制模式来访问 RAM,因此并行进程可以在 fork 后立即访问相同的数据。 PSOCK 集群就像生成 R 的新副本 - 它们必须加载库并接收数据的显式副本。
您可以使用像...这样的模式
library(dplyr)
library(purrr)
library(future)
plan(multicore)
options(mc.cores = availableCores())
d <- data.frame(x = 1:8, g = c("group1", "group2", "group3", "group4"))
y <- "some global object"
split(d, d$g) %>%
map(~ future({Sys.sleep(5);mean(.x$x)})) %>%
map_df(~value(.x))
...在 map_df
步骤上采取一些技巧来进行一些并行处理。请注意,在 {purrr} 下 ~ 是匿名函数语法,其中 .x 是已映射的值。
如果您喜欢危险的生活,您也许可以通过在 {purrr} 中使用私有(private)方法来创建类似的版本,而无需使用 {future}
mcmap <- function(.x, .f, ...) {
.f <- as_mapper(.f, ...)
mclapply(.x, function(.x) {
force(.f)
.Call(purrr:::map_impl, environment(), ".x", ".f", "list")
}) %>%
map(~ .x[[1]])
}
关于用 doMC 替代并行 plyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597744/
是否有一种 Eloquent 方法来使用 ddply() 不仅获得定义的最细粒度组的输出,还获得那些子组的输出? 换句话说,当其中一个分类器是“任何”或“任一”或“无关紧要”时。在两个分组变量的简单情
我正在尝试使用 plyr 计算滚动平均值。数据是行业国家年的数据,对每个行业国家都有重复观察。数据不平衡,但大多数工业国家有大约 15 个观测值。 例如数据如下所示: country IS
我想使用 ddply 函数将相同的函数写入多个列,但我尝试将它们写在一行中,想看看有没有更好的方法来做到这一点? 这是数据的简单版本: data<-data.frame(TYPE=as.integer
我将如何使用 plyr 复制此内容? with(mtcars, tapply(mpg, cyl, summary)) 以同样的优雅,即不详细说明个人统计数据? 最佳答案 library(plyr) d
我有以下数据集(CEU): group x y 1 -23 100 1 -0.90 69.62 1 -0.90 72.03 2 -23
我正在尝试学习如何在 R/plyr 中编写函数。我知道有更简单的方法可以完成我在下面展示的内容,但这不是重点。 在下面的示例中,PLYR 不会向我的新数据框返回新变量 library(plyr) hi
我有一个这样的数据框: mat.in=data.frame(site=c('A','A','A','B','B','B'), var=c('product.A','product.B'
作为学习 plyr 的练习,我尝试对 Rob Hyndman 最近发布的一篇文章做一个 plyr 版本: library(forecast); library(plyr) # Hyndman, R.
我想在一个图上绘制多个时间序列。目前我可以单独绘制它们但不能一起绘制。我怎样才能加入数据,因为年份是按小数分割的。 我基本上想要结束的是这个 Plotting multiple time-series
有没有办法将变量的值分配给 plyr 中的结果列名? 所以在这段代码中... column_name column_names df > # temporal variable > for (c
我是 plyr(和 R)的新手,正在寻找一些帮助来开始。以棒球数据集为例,我如何计算联赛和球队(lg 和球队)“击球数”的同比(yoy)变化? library(plyr) df1 <- aggrega
我使用了plyr 包提供的strip_splits(df) 函数来获取数据框列表。我现在想将数据框列表连接在一起,并添加回用于拆分它们的变量。下面突出显示的文档使我相信这应该是可能的,但是我找不到合适
我正在尝试将一个函数 (weight.func) 传递给另一个调用 ddply 的函数(包装器)。我希望 ddply 使用该函数 (weight.func) 作为其计算的一部分。当 weight.fu
我有一个非常大的数据框,我需要在两列上连接到另一个数据框。我一直在使用 merge 来完成 ir,但 R 内存不足,表越大。是否有使用 dplyr 或 plyr 的类似解决方案?我听说他们需要更少的内
我想为某些数据组合生成相同类型的图表。目前,我正在使用 plyr 来拆分数据并为每个组合执行一些代码。 例如,假设 dataframe 包含公司、部门、地区和收入。这是我的伪代码: d_pl
我喜欢 plyr 将数据帧拆分为多个数据集,然后对每个数据集执行相同操作的能力。最好的部分是当它以整洁紧凑且标记良好的表格的形式向您显示结果时。我喜欢使用 each() 将一堆计算放入一行中。但是,我
基本上我想要一个基于我的群组的自动增量 id 列 - 在这种情况下。(高棉语,剪切) > myDataFrame size kmer cvCut cumsum 1
我无法理解 plyr 包的用法。我尝试使用它来拆分存储在列表中的数据帧,应用函数,将结果存储为数据帧并将数据帧再次组合为列表。 因此,鉴于以下数据: #create test dfs
我以为我有一个非常简单的数据帧转换,但出于某种原因我无法理解它似乎需要永恒,这让我怀疑它可能没有按照我的希望进行。任何人都可以解释一下吗? 第 1 部分 - 将源数据转换为单独的列(实际 df 有 2
我遇到了一个非常不同的问题,在 fullscreen我的模式plyrjs没有向 fullscreen 播放视频 我试图重现 问题 中的代码相同密码笔 但它适用于 密码笔 为什么?。 问题:为什么相同的
我是一名优秀的程序员,十分优秀!