代码之家  ›  专栏  ›  技术社区  ›  Demetri Pananos

对数据帧的特定列使用pmap

  •  1
  • Demetri Pananos  · 技术社区  · 7 年前

    我想用Purr模拟一些公平和不公平硬币的抛硬币。我有参数 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
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    我们可以循环遍历“p\u0”列并应用 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
  •  0
  •   Nettle    6 年前

    直截了当的方法没有其他一些答案那么优雅,但更具可读性(而且不会太长)。

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

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