R & dplyr - переменная bin, использующая ключ на основе другого столбца - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать столбец bin для нижеприведенного data.frame df, но этот контейнер будет зависеть от столбца key. lookup data.frame содержит определения бина для каждого значения ключа.

df <- data.frame(
  key = c("foo", "bar"),
  value = c(1, 10),
  stringsAsFactors = FALSE
)

lookup <- data.frame(
  foo = c(0, 5, 10),
  bar = c(0, 12, 15),
  stringsAsFactors = FALSE
)

bins <- df %>% rowwise() %>% 
  mutate(bin = as.numeric(cut(value, breaks = lookup %>% select(key) %>% pull, include.lowest = TRUE)))

Функция выше дает желаемый результат:

> bins
  key value bin
1 foo     1   1
2 bar    10   1

Тем не менее, data.frame, который я на самом деле использую, намного больше. Функция очень медленная. Есть ли лучший способ ускорить это?

1 Ответ

0 голосов
/ 29 августа 2018

Один вариант: pmap

library(purrr)
library(dplyr)
pmap_dbl(df, ~ as.numeric(cut(..2, breaks = lookup[[..1]]))) %>% 
                mutate(df, bin = .)
#   key value bin
#1 foo     1   1
#2 bar    10   1

Тесты

df1 <- df[rep(seq_len(nrow(df)), 1e4), ]
system.time({bins <- df1 %>% 
                    rowwise() %>%             
                    mutate(bin = as.numeric(cut(value, 
                        breaks = lookup %>% 
                                    select(key) %>%
                                    pull, include.lowest = TRUE)))})
#  user  system elapsed 
# 25.907   0.120  25.914 

system.time({bins2 <- pmap_dbl(df1, ~ 
                as.numeric(cut(..2, breaks = lookup[[..1]]))) %>%       
                      mutate(df1, bin = .)})
#   user  system elapsed 
#  1.666   0.008   1.673 

all.equal(bins, bins2)
#[1] TRUE
...