Сопоставить вложенные данные по строке r - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть данные, которые выглядят следующим образом (еще раз спасибо 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))

Я пытаюсь изменить дополнительный столбец, который отображает функцию для каждой строки.например, вычислите dnorm для каждого элемента вложенной переменной в dat$data[[1]]$value, используя dat$mu[1] и dat$stdev[1], и продолжайте делать то же самое для второй строки.

Столбец, который я хотел бы изменить, является тибблом[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 <- dat %>% mutate(sigma = map(data, ~ sum(.x$value))), работает нормально, не ссылаясь на другие значения в df.Для меня это первые дни, когда я использовал вложенные данные и карту таким образом - искал документацию для всех функций карты, чтобы попытаться решить эту проблему, но пока не повезло!Если это ясно как грязь, я могу попытаться уточнить - заранее спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Мы можем использовать параллельную карту:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...