purrr映射到列表中的每个项目而不仅仅是列表

时间:2018-04-21 18:05:32

标签: r purrr

我有一个round函数,我希望将其应用于每个列表中的每个元素,但我的代码当前围绕整个列表。如何使用purrr

解决此问题
> library(purrr)
> library(tidy verse)
> 1:3 %>%
      map(~ rnorm(104, .x)) %>% 
      map(~ round(max(.x, 0), 0))

 [[1]]
[1] 4

[[2]]
[1] 5

[[3]]
[1] 6

如果它有帮助,那么这样做的非咕噜声方式将是以下

a = sapply(rnorm(104, mean = 20, sd = 10), function(x) round(max(x, 0), 0))
b = sapply(rnorm(104, mean = 20, sd = 10), function(x) round(max(x, 0), 0))
c = sapply(rnorm(104, mean = 20, sd = 10), function(x) round(max(x, 0), 0))

2 个答案:

答案 0 :(得分:1)

你可以在另一个map内完成。你调用max的方式是给出该向量中所有数字的最大值,0加到向量的末尾,所以它只给出一个值。

请尝试这样做:使用map_dbl映射向量中的每个值,将的最大值该单个值和0,然后将其传递给round

1:3 %>%
    map(~rnorm(104, .x) %>% map_dbl(max, 0) %>% round())

答案 1 :(得分:1)

@camille很好地回答了这个问题。这是在自定义函数中使用pmax的替代方法

positive_round <- function(...) round(pmax(..., 0), 0)

1:3 %>%
  map(~ rnorm(104, .x)) %>% 
  map(~positive_round(0,.x))