Отображение функции на два вложенных объекта - PullRequest
2 голосов
/ 17 июня 2019

Я пытаюсь отобразить функцию dplyr::mutate на два набора вложенных элементов таблицы, содержащихся в наборе данных.Моя цель - добавить новые столбцы к каждому столбцу, вложенному в db$data.y, используя соответствующие коэффициенты во вложенных столбцах db$data.x.

. Ниже я привел воспроизводимый пример.Каждая строка db относится к разной шкале, которую мы проверяем.Вложенные столбцы в db$data.x содержат компоненты дисперсии, которые будут использоваться для дальнейших вычислений.Вложенные тиблы в db$data.y содержат одинаковый набор из двух столбцов, в которых комбинация числа случаев (от 1 до 10) и оценщиков (от 1 до 2) различна для каждой строки.

library(dplyr)
library(purrr)

coefficients <- data.frame(Scale = rep(1:5, each = 5), 
                           Component = rep(c("R", "S", "T", "RxS", "SxT"), 5), 
                           Value = rep(c(2, 4, 7, 3, 5, 5, 6, 7, 3, 5, 2, 6, 3, 6, 4, 7, 3, 7, 12, 8, 7, 11, 14, 9, 2))) %>% 
                           group_by(Scale) %>% nest()

sim.data <- data.frame(Scale = rep(1:5, each = 20), 
                       Occasion = rep(1:10, 2), 
                       Rater = rep(1:2, each = 10)) %>% 
                       group_by(Scale) %>% nest()

db <- left_join(coefficients, sim.data, by = "Scale")

#> db
# A tibble: 5 x 3
#  Scale data.x           data.y           
#  <int> <list>           <list>           
#1     1 <tibble [5 x 2]> <tibble [20 x 2]>
#2     2 <tibble [5 x 2]> <tibble [20 x 2]>
#3     3 <tibble [5 x 2]> <tibble [20 x 2]>
#4     4 <tibble [5 x 2]> <tibble [20 x 2]>
#5     5 <tibble [5 x 2]> <tibble [20 x 2]>

#> db$data.x[[1]]
# A tibble: 5 x 2
#  Component Value
#  <fct>     <dbl>
#1 R             2
#2 S             4
#3 T             7
#4 RxS           3
#5 SxT           5

#> db$data.y[[1]]
# A tibble: 20 x 2
#   Occasion Rater
#      <int> <int>
# 1        1     1
# 2        2     1
# 3        3     1
# 4        4     1
# 5        5     1
# 6        6     1
# 7        7     1
# 8        8     1
# 9        9     1
#10       10     1
#11        1     2
#...

Конечная цель - вычислить столбец db$data.y$Abs для каждой шкалы, для которой нам нужно использовать компоненты дисперсии, содержащиеся в db$data.x.Я мог бы сделать это для каждого масштаба отдельно, но это кажется чрезвычайно трудоемким.Кто-нибудь может помочь с этим?

db$data.y[[1]] %>% 
     mutate(Abs = db$data.x[[1]][[1,2]] / db$data.y[[1]]$Occasion + 
                  db$data.x[[1]][[2,2]] / db$data.y[[1]]$Rater + 
                  db$data.x[[1]][[3,2]] / (db$data.y[[1]]$Occasion * db$data.y[[1]]$Rater))

# A tibble: 20 x 3
#   Occasion Rater Abs
#      <int> <int> <dbl>
# 1        1     1 13   
# 2        2     1  8.5 
# 3        3     1  7   
# 4        4     1  6.25
# 5        5     1  5.8 
# 6        6     1  5.5 
# 7        7     1  5.29
# 8        8     1  5.12
# 9        9     1  5   
#10       10     1  4.9 

Я пытался с purrr::map2, но, если я не ошибаюсь, он работает на двух столбцах одного и того же вложенного объекта, тогда как в этом случае яЯ имею дело с двумя разными вложенными объектами.Я был бы рад рассмотреть и другие решения.

1 Ответ

2 голосов
/ 17 июня 2019

Я думаю, вы правы, что вы можете использовать map2(), но вам нужно будет использовать его в mutate(), чтобы вы могли использовать два вложенных столбца в качестве первых двух аргументов этой функции.

Затем вы можете использовать свой текущий код mutate() в качестве функции в map2() для изменения data.y.Вы увидите, что я заменяю текущий data.y измененным объектом с тем же именем во внешнем mutate().

Нечто подобное будет выглядеть так:

db %>%
    mutate(data.y = map2(data.x, 
                         data.y, 
                         ~mutate(.y, Abs = .x[[1, 2]]/.y$Occasion +
                                     .x[[2, 2]]/.y$Rater +
                                     .x[[3, 2]]/(.y$Occasion*.y$Rater))))

Первыйфрейм данных выглядит как

db %>%
    mutate(data.y = map2(data.x, 
                         data.y, 
                         ~mutate(.y, Abs = .x[[1, 2]]/.y$Occasion +
                                     .x[[2, 2]]/.y$Rater +
                                     .x[[3, 2]]/(.y$Occasion*.y$Rater)))) %>%
    pull(data.y) %>%
    pluck(1)

# A tibble: 20 x 3
   Occasion Rater   Abs
      <int> <int> <dbl>
 1        1     1 13   
 2        2     1  8.5 
 3        3     1  7   
 4        4     1  6.25
 5        5     1  5.8 
 6        6     1  5.5 
 7        7     1  5.29
 8        8     1  5.12
 9        9     1  5   
10       10     1  4.9 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...