Применить функцию к каждой записи одной таблицы к каждой записи другой - PullRequest
1 голос
/ 21 апреля 2019

Я хотел бы применить функцию 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 в качестве индекса в функцию карты и дополнительно 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   

1 Ответ

1 голос
/ 21 апреля 2019

есть одна возможность, используя 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...