简体   繁体   English

按行 r 映射嵌套数据

[英]Map nested data by row r

I have data that look like this (thanks once again dput!):我有这样的数据(再次感谢 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))

I am trying to mutate an extra column which maps a function over each row.我试图改变一个额外的列,它在每一行上映射一个函数。 eg calculate dnorm for each element of the nested variable in dat$data[[1]]$value using dat$mu[1] and dat$stdev[1] and the go on to do the same for row two.例如,使用dat$mu[1]dat$stdev[1]计算dat$data[[1]]$value嵌套变量的每个元素的 dnorm,然后继续对第二行执行相同的操作。

The column I would like to mutate is a tibble [10 x 1] for each row containing this as the output:我想改变的列是包含它作为输出的每一行的小标题 [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])

Things I have tried that don't work but might be close?:我尝试过但不起作用但可能接近的事情?:

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

a basic map function like this dat_3 <- dat %>% mutate(sigma = map(data, ~ sum(.x$value))) works fine without referencing other values in the df.像这样的基本映射函数dat_3 <- dat %>% mutate(sigma = map(data, ~ sum(.x$value)))工作正常,而无需引用 df 中的其他值。 This is early days for me using nested data and map in this way - been looking at the documentation for all the map functions to try solve this but no luck yet!这是我以这种方式使用嵌套数据和地图的早期阶段 - 一直在查看所有地图功能的文档以尝试解决这个问题,但还没有运气! If that's clear as mud I can try clarify - thanks in advance!如果这很清楚,我可以尝试澄清 - 在此先感谢!

We can use a parallel map:我们可以使用并行映射:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM