【问题标题】:Using pmap with specific columns of a dataframe将 pmap 与数据框的特定列一起使用
【发布时间】:2018-01-04 16:13:57
【问题描述】:

我想使用 purrr 模拟一些公平和不公平硬币的硬币翻转。我将rbinom 的参数作为数据框中的列。这是我开始使用的一些代码:

library(tidyverse)

#setting up params for rbinom
params = list(size = 600, n = 1, p_fair = 0.5,p_unfair = 0.6)


params %>% 
  purrr::map_df(~rep(., times = 10))

如何使用purrr 将不同的参数p_fair/p_unfair 传递到rbinom 并将结果作为一列放入我的数据框中?我希望结果看起来像:

 size     n p_fair p_unfair  fair unfair
   <dbl> <dbl>  <dbl>    <dbl> <int>  <int>
 1   600     1    0.5      0.6   308    373
 2   600     1    0.5      0.6   305    367
 3   600     1    0.5      0.6   280    367
 4   600     1    0.5      0.6   299    374
 5   600     1    0.5      0.6   298    360
 6   600     1    0.5      0.6   298    346
 7   600     1    0.5      0.6   301    359
 8   600     1    0.5      0.6   292    376
 9   600     1    0.5      0.6   300    347
10   600     1    0.5      0.6   305    357

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    我们可以遍历“p_”列并应用rbinom

    library(dplyr)
    library(purrr)
    df1 %>%
        select(matches('p_')) %>%
        map(~ df1 %>%
                select(n, size) %>% 
                mutate(p = .x) %>%
                pmap_int(rbinom)) %>% 
        bind_cols %>%
        rename_all(funs(sub("p_", "", .))) %>%
        bind_cols(df1, .)
    

    另一种选择是使用gather 转换为“长”格式,应用rbinom,然后将其重新整形为“宽”

    library(tidyr)
    df1 %>%
      gather(key, p, p_fair:p_unfair) %>%
      mutate(rval = pmap_int(.[c('n', 'size', 'p')], rbinom)) %>% 
      separate(key, into = c('key1', 'key2')) %>%
      select(-key1) %>% 
      group_by(key2) %>% 
      mutate(n1 = row_number()) %>%
      select(-p) %>% 
      spread(key2, rval) %>% 
      select(-n1, -n, -size) %>%
      bind_cols(df1, .)
    

    数据

    df1 <- params %>% 
                map_df(~rep(., times = 10))
    

    【讨论】:

      【解决方案2】:

      直截了当的方法不像其他一些答案那样优雅,但更具可读性(并且不会更长)。

      # Libraries
      library(tidyverse)
      
      # Data
      params = list(size = 600, n = 1, p_fair = 0.5,p_unfair = 0.6)
      df1 <- params %>% map_df(~rep(., times = 10))
      

      这里提醒一下函数及其参数

      # rbinom(n, size, prob)
      

      创建包含所有参数的公平/不公平数据框(每个列标题以相关参数命名)。

      p_fair_vars  <- df1 %>% 
        select(n, size, p = p_fair)
      
      p_unfair_vars <- df1 %>% 
        select(n, size, p = p_unfair)
      

      使用 pmap 应用数据框。

      df1 %>% 
        mutate(fair = pmap_int(p_fair_vars, rbinom),
               unfair = pmap_int(p_unfair_vars, rbinom) )
      
      #> # A tibble: 10 x 6
      #>     size     n p_fair p_unfair  fair unfair
      #>    <dbl> <dbl>  <dbl>    <dbl> <int>  <int>
      #>  1   600     1    0.5      0.6   296    351
      #>  2   600     1    0.5      0.6   311    351
      #>  3   600     1    0.5      0.6   290    356
      #>  4   600     1    0.5      0.6   294    359
      #>  5   600     1    0.5      0.6   294    348
      #>  6   600     1    0.5      0.6   306    365
      #>  7   600     1    0.5      0.6   288    370
      #>  8   600     1    0.5      0.6   305    366
      #>  9   600     1    0.5      0.6   314    327
      #> 10   600     1    0.5      0.6   303    356
      

      ...或者:

      df1 %>% 
        mutate(fair_vars = str_c(size, n, p_fair, sep="," ),
               unfair_vars = str_c(size, n,   p_unfair, sep = ","),
               fair = pmap_int(p_fair_vars, rbinom),
               unfair = pmap_int(p_unfair_vars, rbinom)) %>% 
        select(-c(5:6) )
      

      reprex package (v0.2.1) 于 2018 年 11 月 3 日创建

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 2023-03-20
        • 2019-10-17
        • 1970-01-01
        • 2019-04-16
        • 2020-11-18
        • 2019-03-14
        • 1970-01-01
        • 2013-11-21
        相关资源
        最近更新 更多