purrr: разбить информационный кадр и запустить карту на несколько столбцов - PullRequest
0 голосов
/ 16 апреля 2019

У меня большой фрейм данных, и мне нужно рассчитать значения для комбинаций столбцов на основе столбца id. Я хотел бы сделать это в рамках tidyverse, и я могу туда добраться, но он не выглядит очень элегантным и подверженным ошибкам. Возможно, кто-то может мне помочь.

Вот минимальный рабочий пример, аналогичный фактическим данным.

library(tidyverse)

df <- tibble(
  id_combo = c("A_A1", "A_A1", "A_A2", "A_A2", "A_A2"),
  f1 = runif(5),
  f2 = runif(5),
  f3 = runif(5),
  b1 = runif(5),
  b2 = runif(5),
  b3 = runif(5)
)

f1_f2 <- df %>%
  split(.$id_combo) %>%
  map_dbl(., ~var(log(.$f1))+var(log(.$f2)))

f1_f3 <- df %>%
  split(.$id_combo) %>%
  map_dbl(., ~var(log(.$f1))+var(log(.$f2))+var(log(.$f3)))

f1_b2 <- df %>%
    split(.$id_combo) %>%
  map_dbl(., ~var(log(.$f1))+var(log(.$f2))+
              var(log(.$b1))+var(log(.$b2)))

f1_b3 <- df %>%
  split(.$id_combo) %>%
  map_dbl(., ~var(log(.$f1))+var(log(.$f2))+var(log(.$f3))+
              var(log(.$b1))+var(log(.$b2))+var(log(.$b3)))

var_sum_df <- tibble(id_combo = names(f1_f2),f1_f2, f1_f3, f1_b2, f1_b3)

Чего я надеюсь добиться, так это запустить функцию map_dbl (или разумный эквивалент) после split(.$id_combo), указав столбцы на лету.

Я уверен, что это было бы возможно, но мои знания R еще недостаточно развиты, чтобы понять себя.

1 Ответ

1 голос
/ 16 апреля 2019

Я не уверен, правильно ли я понял вопрос, но это то, что вы ищете?

library(tidyverse)
df %>% group_by(id_combo) %>% 
  summarise_all(~var(log(.x))) %>% 
  mutate(f1_f2 = f1 + f2,
         f1_f3 = f1_f2 + f3, 
         f1_b2 = f1_f3 + b1 + b2,
         f1_b3 = f1_b2 + b3) %>% 
  select(id_combo, contains("_"))

# A tibble: 2 x 5
  id_combo  f1_f2  f1_f3 f1_b2 f1_b3
  <chr>     <dbl>  <dbl> <dbl> <dbl>
1 A_A1     0.0582 0.0701  1.24  6.89
2 A_A2     2.43   2.57    3.50  3.76
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...