【发布时间】:2020-07-25 13:12:30
【问题描述】:
我想使用multidplyr,它还没有任何summarise_at。我有数百甚至数千,所以 summarise_at 是必要的,但不幸的是,在 multidplyr 中不可用。
寻找替代方法来解决它。
library('tidyverse')
df <- tibble(ID = c('a','a','b','c','c','e','e','f','g','g'),
var1 = floor(runif(10, min=0, max=100)),
var2 = floor(runif(10, min=0, max=100)),
var3 = floor(runif(10, min=0, max=100)),
var4 = floor(runif(10, min=0, max=100))
)
library('multidplyr')
cluster <- new_cluster(5)
#works
df %>%
group_by(ID) %>%
#partition(cluster) %>%
summarise_at(.vars = vars(starts_with('var')),sum)
#collect()
#works
df %>%
group_by(ID) %>%
partition(cluster) %>%
summarise(var1 = sum(var1),
var2 = sum(var2),
var3 = sum(var3)) %>%
collect()
#doesnt works
df %>%
group_by(ID) %>%
partition(cluster) %>%
summarise_at(.vars = vars(starts_with('var')),sum) %>%
collect()
我什至试过这个
#Define character string vector to replace command line
sum_var <- select(df,starts_with('var')) %>% names()
sum_var_str <- paste0(sum_var," = sum(",sum_var,")")
sum_var_str <- str_c(sum_var_str, collapse = ", ")
> sum_var
[1] "var1" "var2" "var3" "var4"
> sum_var_str
[1] "var1 = sum(var1), var2 = sum(var2), var3 = sum(var3), var4 = sum(var4)"
#works
df %>%
group_by(ID) %>%
{ eval(parse(text = sprintf("summarise(., %s, .groups = 'drop')", sum_var_str))) }
#doesn't works
df %>%
group_by(ID) %>%
partition(cluster) %>%
{ eval(parse(text = sprintf("summarise(., %s, .groups = 'drop')", sum_var_str))) } %>%
collect()
【问题讨论】:
-
这个问题和你之前的问题有什么不同? stackoverflow.com/questions/63088146/… 你想要与
multidplyr一起使用的东西,对吗? -
我认为可行的解决方法没有。尽管该解决方案有效(没有 multidplyr),但它不在我需要的 multidplyr 环境下。大数据????
-
@JimmyR:你试过
tidytable了吗? github.com/markfairbanks/tidytable -
@tung 不错。谢谢,会检查一下。看到了基准。比 tidyverse 好多了。如果可能的话,我仍然热衷于并行核心处理。
标签: r dplyr multidplyr