将功能应用于一个表的每个条目到另一个表的每个条目

时间:2019-04-21 14:08:43

标签: r loops dplyr lapply purrr

我想使用bandedlossfn中的每一项将loss.tib函数应用于bandstib中的所有条目

library(tidyverse)
set.seed(1)
n <- 5
loss <- rbeta(n, 1, 10) * 100

loss.tib <- loss %>% as_tibble %>% mutate(loss = value) %>% mutate(lossid = 
row_number()) %>% select(lossid, loss)
bandstib <- tibble(bandid = seq(4),
                   start = seq(0, 75, by = 25),
                   end = seq(25, 100, by = 25))

bandedlossfn <- function(loss, start, end) {
  pmin(end - start, pmax(0, loss - start))
} 

根据下面的答案,以下代码将产生计算结果:

loss.tib %>% 
mutate(
  result = map(
    loss, ~ tibble(result = bandedlossfn(.x, bandstib$start, bandstib$end))
    )
    ) %>% unnest

但是我想将bandid作为索引包含在map函数中,并将filter(!near(result,0))包含在map函数中。

结果应为:

lossid  loss    bandid  result
1   21.6691088  1   21.6691088  
2   6.9390647   1   6.9390647   
3   0.5822383   1   0.5822383   
4   5.5671643   1   5.5671643   
5   27.8237244  1   25.0000000  
5   27.8237244  2   2.8237244   

1 个答案:

答案 0 :(得分:1)

这是使用map2包中的purrr的一种可能性:

bandstib %>% 
  mutate(result = map2(start, end, ~bandedlossfn(loss.tib[[1]], .x, .y)))

根据您希望输出的内容,可以从此处继续操作,例如使用unnest

编辑

以下是使用map而不是map2来应用它的方法:

loss.tib %>% 
  mutate(result = map(value, bandedlossfn, start = bandstib$start, end = bandstib$end)) %>%
  unnest() %>% 
  mutate(bandid = rep(seq(4), n))