【问题标题】:Apply function over every entry one table to every entry of another将函数应用于一个表的每个条目到另一个表的每个条目
【发布时间】:2019-09-11 00:01:04
【问题描述】:

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

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   

【问题讨论】:

  • 对不起,应该是丢失
  • 您的预期输出是什么样的?
  • @Ronak Shah - 已添加

标签: r loops dplyr lapply purrr


【解决方案1】:

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

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

【讨论】:

  • 你好@Cett,谢谢我怎么能反过来呢?我想将频段应用于损失表
  • 嗨,对不起,我误解了你的问题。我更新了我的答案
  • 太棒了!取消嵌套时如何包含bandid
  • 我把这个加入了。根据您的确切数据,将bandid 包含为输出bandedlossfn 可能更有意义。
  • 好的,就这样。但是,我的 loss.tib 有 30m 行,所以我想在 map 函数本身中索引和过滤结果 != 0 。不确定您是否有快速解决方案,或者我是否应该作为另一个问题提出。
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2021-12-22
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多