【发布时间】:2019-04-07 05:50:14
【问题描述】:
--- 从rstudio community forum 交叉发布tidyverse 之外的潜在解决方案。
基本情况是组之间的计算是独立的,但是每个组都需要输入一些从自己计算出来的参数。一个简单的例子是找到小于列最大值一半的第一个元素的索引。唯一的变化是一列X 需要使用通过其他列A, B, C 计算的最大值。
我有一个使用group_map(类似于do)的解决方案来解决我在grouped calculation 上的问题。但性能似乎不是最佳的。与group_map 一起使用时,summarise_at 似乎需要更长的时间(与没有它的时间相比)
library(tidyverse)
times <- 1e5
cols <- 4
df3 <- as.data.frame(x = matrix(rnorm(times * cols, mean = 5), ncol = cols)) %>%
rename(A = V1, B = V2, C = V3, X = V4)
df3 <- cbind(grp = rep(seq_len(1e3), each = 100), df3) %>%
group_by(grp)
system.time(
df3 %>%
group_map(~
{
all_max <- summarise_at(., vars(A:C), max) %>% mutate(X = rowMeans(.))
map2_df(., all_max, ~match(TRUE, .x < 0.5 * .y))
}
)
)
#> user system elapsed
#> 3.87 0.00 3.98
system.time(
df3 %>% summarise_at(vars(A:C), max) %>% mutate(X = rowMeans(.))
)
#> user system elapsed
#> 0.02 0.00 0.01
system.time(
df3 %>% summarise_at(vars(A:X), ~match(TRUE, . < 0.5 * max(.)))
)
#> user system elapsed
#> 0.25 0.02 0.26
由reprex package (v0.2.1) 于 2019 年 4 月 5 日创建
有提高性能的想法吗?似乎大多数函数都是基于列的,我还没有找到有效地完成这个简单任务的解决方案。
【问题讨论】:
-
也许您想描述您的问题而不是发布您的解决方案? xyproblem.info
-
问题是关于解决方案的性能。我将进行编辑以澄清。
-
我真的不明白你想用你的代码做什么,你能再补充一些吗?您提供的三个 sn-ps 都提供不同的输出。
-
另外,如果没有
set.seed,对你想要做的事情进行逆向工程就特别困难 -
@MichaelChirico 抱歉,第一个给出了我想要的结果。第二个和第三个只是检查操作的时间。我想证明
summarise与grooup_map一起使用时要慢得多
标签: r data.table tidyverse