【问题标题】:Create tidy multiple reduce function创建整洁的多个reduce函数
【发布时间】:2019-06-07 07:28:23
【问题描述】:

我想用一个函数替换这个 (want):

library(tidyverse)
library(rlang)

set.seed(1)
create_a <- function() {
      list(x = 1:10, y = data.frame(aa = round(rnorm(10, 2000, 10), 0),
                                bb = sample(letters[3:8], 10, replace = T),
                                stringsAsFactors = F))
}

create_b <- function() {
  list(x = 1:10, y = data.frame(aa = round(rnorm(10, 10, 1), 0),
                                bb = sample(letters[3:8], 10, replace = T),
                                stringsAsFactors = F))
}  

want <- list(x = reduce(map(list(create_a(), create_b()), 1), c),
             y = reduce(map(list(create_a(), create_b()), 2), rbind)) # or bind_rows

有多个函数(create_acreate_b)可以创建具有相同名称的元素的输出列表。与上面的例子相比,实际函数中的计算有很大的不同。 该函数应如下所示:

multiple_reduce <- function(...) {
  # ????
}
want <- multiple_reduce(create_a(), 
                        create_b())

你是如何使用整洁的方法做到这一点的?

want 在这两种情况下都应该是这样的:

$x
 [1]  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  6  7  8  9 10

$y
     aa bb
1  2014  e
2  1999  g
3  2004  e
4  1999  d
5  1986  g
6  1996  d
7  1996  g
8  1999  c
9  2011  d
10 2008  c
11    9  h
12   10  g
13   11  e
14   10  e
15   11  c
16   10  c
17    9  g
18   10  c
19    9  e
20   11  f

【问题讨论】:

  • 您能提供当前和预期的输出吗?目前是XY problem
  • 您想基于相同的名称组合它们吗?还是基于同一类型?
  • 我想将 x(或不同列表中的第 1 位)组合成一个单一的聚合 x,并将 y 组合成一个 y。我要聚合的函数的结果列表的顺序和名称是一样的。
  • 这样接近吗:map2(create_a(),create_b(),function(x,y) rbind(x,y))?
  • 是的,除了向量应该连接起来 (c)。另一方面,pmap(create_a(),create_b(), create_b(),function(...) rbind(...)) 似乎不起作用。

标签: r tidyverse purrr rlang


【解决方案1】:

也许一种方法是将所有输入组合在一起并根据它们的名称拆分它们,以便我们将具有相似名称的列表放在一起。然后,我们可以检查列表是否为原子类型,并相应地将它们组合为一个向量或数据帧。

library(tidyverse)

multiple_reduce <- function(a, b, ...) {
   combine_list <- c(a, b, ...)
   new_list <- split(combine_list, names(combine_list))
   list(x = map(new_list, ~keep(., is.atomic)) %>% flatten %>% reduce(c),
        y = map(new_list, ~discard(., is.atomic)) %>% flatten %>% bind_rows)
}

multiple_reduce(create_a(), create_b())

#$x
# [1]  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5  6  7  8  9 10

#$y
#     aa bb
#1  2001  g
#2  1998  h
#3  2003  g
#4  1971  h
#5  1998  h
#6  2001  f
#7  1993  d
#8  1990  c
#9  2009  d
#10 2019  d
#11   10  h
#12    9  d
#13   10  g
#14    8  f
#15   11  e
#16    9  c
#17   12  c
#18   10  f
#19   10  c
#20    8  h

这也适用于多个此类列表

multiple_reduce(create_a(), create_b(), create_a(), create_b())

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2016-04-04
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多