【问题标题】:R & dplyr - bin variable using key based on another columnR&dplyr - 使用基于另一列的键的bin变量
【发布时间】:2018-08-29 20:16:40
【问题描述】:

我正在尝试为以下 data.frame df 创建一个 bin 列,但该 bin 将取决于 key 列。 lookup data.frame 包含每个 key 值的 bin 定义。

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 要大得多。该功能非常缓慢。有没有更好的方法来加快速度?

【问题讨论】:

    标签: r dplyr binning


    【解决方案1】:

    一个选项是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
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多