首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >map函数中的索引列表

map函数中的索引列表
EN

Stack Overflow用户
提问于 2019-04-21 23:45:04
回答 1查看 34关注 0票数 0

这是上一个问题的续篇:Apply function over every entry one table to every entry of another

我有以下表loss.tibbandstib以及函数bandedlossfn

library(tidyverse)
set.seed(1)
n <- 5
loss.tib <- tibble(lossid = seq(n),
                   loss = rbeta(n, 1, 10) * 100)

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

可以使用bandstib作为参数在loss.tib上应用此函数:

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

但是,我想在map中添加一个索引,如下所示:

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

但它似乎并没有像预期的那样工作。我还想在映射函数中添加filter(!near(result,0)),以实现高效的内存管理。

我期望的结果是:

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   

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 00:56:41

这里有一种可能:首先嵌套bandstib并将其添加到loss.tib。这样,id就符合您的计算方式:

bandstib <- tibble(bandid = seq(4),
                   start = seq(0, 75, by = 25),
                   end = seq(25, 100, by = 25)) %>% 
  nest(.key = "data")

set.seed(1)
n <- 5
result <- tibble(loss = rbeta(n, 1, 10) * 100) %>% 
  bind_cols(., slice(bandstib, rep(1, n))) %>%
  mutate(result = map2(loss, data, ~bandedlossfn(.x, .y$start, .y$end))) %>% 
  unnest()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55784212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档