R 在两个嵌套对象上映射函数

R 在两个嵌套对象上映射函数,r,dplyr,purrr,R,Dplyr,Purrr,我试图将函数dplyr::mutate映射到一个数据集中包含的两组嵌套tibble上。我的目标是通过使用嵌套的tibblesdb$data.x中的相应系数,向嵌套在db$data.y中的每个tibble添加新列 下面,我提供了一个可复制的示例。每一行db表示我们正在验证的不同刻度。db$data.x中的嵌套TIBLES包含将用于执行进一步计算的方差分量。db$data.y中的嵌套tibble包含相同的两列集合,其中每行的次数(从1到10)和评分器(从1到2)的组合不同 library(dplyr

我试图将函数
dplyr::mutate
映射到一个数据集中包含的两组嵌套tibble上。我的目标是通过使用嵌套的tibbles
db$data.x
中的相应系数,向嵌套在
db$data.y
中的每个tibble添加新列

下面,我提供了一个可复制的示例。每一行
db
表示我们正在验证的不同刻度。
db$data.x
中的嵌套TIBLES包含将用于执行进一步计算的方差分量。
db$data.y
中的嵌套tibble包含相同的两列集合,其中每行的次数(从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
#...


我尝试过使用
purrr::map2
,但如果我没有弄错的话,它可以在同一嵌套对象的两列上工作,而在本例中,我处理的是两个不同的嵌套对象。我也很乐意考虑其他解决方案。

< P>我认为你可以使用<代码> MAP2()/<代码>,但是你需要在<代码>突变()/代码>中使用它,这样你就可以使用这两个嵌套列作为该函数的前两个参数。p> 然后,您可以使用当前的
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 
...
db%>%
突变(data.y=map2(data.x,
数据.y,
~mutate(.y,Abs=.x[[1,2]]/.y$s+
.x[[2,2]]/.y$Rater+
.x[[3,2]]/(.y$sition*.y$Rater)))%>%
拉动(数据y)%>%
拔毛(1)
#一个tibble:20x3
场合评分器
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 
...
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 
...