首页 > 解决方案 > 将函数应用于一个表的每个条目到另一个表的每个条目

问题描述

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

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   

标签: rloopsdplyrlapplypurrr

解决方案


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))

推荐阅读