【问题标题】:Map nested data by row r按行 r 映射嵌套数据
【发布时间】:2018-11-13 03:36:28
【问题描述】:

我的数据看起来像这样(再次感谢 dput!):

dat <- structure(list(vars = c("var_1", "var_2"), data = list(structure(list(
  time = 1:10, value = c(1:10
  )), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
  )), structure(list(time = 1:10, value = c(11:20
  )), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
  ))), mu = c(1, 2), stdev = c(1,2)), class = c("tbl_df", "tbl", "data.frame"),
  row.names = c(NA,-2L))

我正在尝试改变一个额外的列,该列在每一行上映射一个函数。例如,使用 dat$mu[1]dat$stdev[1]dat$data[[1]]$value 中嵌套变量的每个元素计算 dnorm,然后继续对第二行执行相同操作。

我想改变的列是一个 tibble [10 x 1],每一行都包含这个作为输出:

dnorm(dat$data[[1]]$value, mean = dat$mu[1], sd = dat$stdev[1])
dnorm(dat$data[[2]]$value, mean = dat$mu[2], sd = dat$stdev[2])

我尝试过的方法不起作用但可能很接近?:

# This alternates between mean and stdev for each element of each nested variable
dat_1 <- dat %>% 
  mutate(z = map(data, ~ dnorm(.x$value, mean = dat$mu, sd = dat$stdev)))
# apply by row has structure issues
dat_2 <- dat %>% 
  apply(MARGIN = 1, function(x){
  mutate(x, z = map(data, ~ dnorm(.x$value, mean = dat$mu, sd = dat$stdev)))
    })

dat_3 &lt;- dat %&gt;% mutate(sigma = map(data, ~ sum(.x$value))) 这样的基本映射函数可以正常工作,而无需引用 df 中的其他值。这是我以这种方式使用嵌套数据和地图的早期阶段 - 一直在查看所有地图功能的文档以尝试解决这个问题,但还没有运气!如果这很清楚,我可以尝试澄清 - 在此先感谢!

【问题讨论】:

    标签: r nested apply purrr


    【解决方案1】:

    我们可以使用平行图:

    library(purrr)
    library(dplyr)
    
    expected_out1 <- dnorm(dat$data[[1]]$value, mean = dat$mu[1], sd = dat$stdev[1])
    expected_out2 <- dnorm(dat$data[[2]]$value, mean = dat$mu[2], sd = dat$stdev[2])
    
    out <- 
      dat %>% 
      mutate(z = pmap(list(map(data, "value"), mu, stdev), dnorm))
    
    all.equal(out$z, list(expected_out1, expected_out2))
    # [1] TRUE
    

    【讨论】:

    • 太棒了,谢谢!我一直在努力理解 pmap,现在更有意义了!
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多