代码之家  ›  专栏  ›  技术社区  ›  rnorouzian

映射_df()以生成类似于“rbind”ed`lapply()的输出`

  •  1
  • rnorouzian  · 技术社区  · 4 年前

    有没有办法让我 map_df() 调用下面的命令生成类似于 desired_output 下面呢?

    library(nlme)
    library(tidyverse)
    
    dat <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/var.csv')
    dat$fmonth <- factor(dat$month)
    
    m5 <- lme(y ~ x*fmonth, random = ~1|id, data = dat, weights = varPower(form=~x|fmonth), 
              control = lmeControl(msMaxIter = 1e2))
    
    hetro_var <- function(fit) coef(fit$modelStruct$varStruct, uncons = FALSE, allCoef = TRUE)
      
    
    x_fmonth1 <- map_df(hetro_var(m5), ~sigma(m5)^2*abs(dat$x)^(2*hetro_var(m5)[.])) # Can this produce desired_output?
    
    x_fmonth2 <- lapply(names(hetro_var(m5)), function(i)sigma(m5)^2*abs(dat$x)^(2*hetro_var(m5)[i]))
    
    names(x_fmonth2) <- names(hetro_var(m5))
    
    desired_output <- bind_rows(x_fmonth2) # can `map_df()` above produce this output?
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   andrew_reece    4 年前

    你可以用 map_df() . 只需要把 hetro_var(m5)

    mapdf_output <-
      names(hetro_var(m5)) %>%
      set_names(names(hetro_var(m5))) %>%
      map_df(function(i)sigma(m5)^2*abs(dat$x)^(2*hetro_var(m5)[i]))
    
    assertthat::are_equal(mapdf_output, desired_output) # TRUE
    

    我们不得不说出这个名字似乎有点可笑 map a question 关于这件事不久前,似乎没有办法绕过 set_names() 复制。

        2
  •  1
  •   Ronak Shah    4 年前

    你可以用 map_dfc 然后过去 names 作为输入与 lapply

    purrr::map_dfc(names(hetro_var(m5)), 
                   ~tibble(!!.x := sigma(m5)^2*abs(dat$x)^(2*hetro_var(m5)[.x])))
    
    # A tibble: 768 x 12
    #     `5`   `6`   `9`  `10`  `12`   `3`   `4`  `11`    `8`   `2`   `1`    `7`
    #   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
    # 1 0.566 0.612 0.864 0.861 0.498 0.448 0.401 0.582 0.160  0.474 0.355 0.276 
    # 2 0.691 0.748 1.06  1.06  0.608 0.546 0.487 0.710 0.192  0.578 0.431 0.334 
    # 3 0.253 0.273 0.378 0.377 0.224 0.203 0.182 0.260 0.0757 0.214 0.162 0.127 
    # 4 0.484 0.523 0.735 0.733 0.426 0.384 0.343 0.497 0.138  0.406 0.304 0.237 
    # 5 0.376 0.406 0.568 0.567 0.332 0.300 0.269 0.386 0.109  0.317 0.239 0.186 
    # 6 0.335 0.361 0.504 0.503 0.296 0.267 0.239 0.344 0.0981 0.282 0.213 0.167 
    # 7 0.524 0.566 0.797 0.795 0.461 0.415 0.371 0.538 0.149  0.439 0.329 0.256 
    # 8 0.229 0.247 0.342 0.341 0.203 0.184 0.165 0.235 0.0691 0.194 0.147 0.116 
    # 9 0.261 0.282 0.391 0.390 0.231 0.209 0.188 0.268 0.0780 0.221 0.167 0.131 
    #10 0.174 0.187 0.258 0.257 0.154 0.140 0.126 0.178 0.0535 0.148 0.113 0.0889
    # … with 758 more rows
    

    或与 imap_dfc :

    purrr::imap_dfc(hetro_var(m5), ~sigma(m5)^2*abs(dat$x)^(2*hetro_var(m5)[.y]))