繁体   English   中英

如何对 map2 function (purrr) 中的列进行子集化,以便向量长度一致?

[英]How do I subset columns within map2 function (purrr) so vector lengths agree?

如何在列子集上使用map2 function(在purrr包中)而不会出现“映射向量必须具有一致长度”的错误? 子集列的数量等于另一个向量的长度。

这是我的数据:

library(tidyverse)
library(rstatix)

df <- tibble::tribble(
        ~id, ~edge, ~trt,         ~nl,          ~lm,         ~md,           ~c,        ~mgg,       ~mgcm,          ~p,         ~sp,         ~ap,         ~la,       ~lacm,      ~lacmd,
         1L,   "S",  "C", 1.802500944, -1.126394361, 1.747757193, -0.302911966, 2.942376992,  1.01978392, 1.603508872, 1166.214587, 1.104182097, 3.630403855, 0.925433649, 2.083967271,
         2L,   "S",  "T",          NA,           NA,          NA,           NA,          NA,          NA,          NA,          NA,          NA,          NA,          NA,          NA,
         3L,   "D",  "C",  1.59505822, -1.554475881, 1.173922711, -0.340665184, 1.854642163, 0.787036727,  1.40878277,  663.125567, 0.898799413, 3.332281129, 0.803131628, 1.841247752,
         4L,   "D",  "T", 1.342572531,  -2.21548947, 0.961702527, -0.331617331, 1.645569808, 0.750246559,  0.67441638, 63.63830862, 0.542966439, 2.416127169, 0.574963833, 1.529239129,
         5L,   "S",  "C", 1.802500944, -0.165110402, 2.162768585, -0.285160482, 3.136984959, 1.093832043, 2.209960854,   495.84715, 1.164570199, 4.799142774, 0.994423991, 2.034565573,
         6L,   "S",  "T", 2.141481291,  0.250369615, 2.439863935, -0.218925863, 3.358891011, 1.163094493,  2.30563155, 910.5631088, 1.198833277, 5.219802305, 1.097357732, 2.149000371
        )

head(df)
#> # A tibble: 6 x 15
#>      id edge  trt      nl     lm     md      c   mgg   mgcm      p     sp     ap
#>   <int> <chr> <chr> <dbl>  <dbl>  <dbl>  <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#> 1     1 S     C      1.80 -1.13   1.75  -0.303  2.94  1.02   1.60  1166.   1.10 
#> 2     2 S     T     NA    NA     NA     NA     NA    NA     NA       NA   NA    
#> 3     3 D     C      1.60 -1.55   1.17  -0.341  1.85  0.787  1.41   663.   0.899
#> 4     4 D     T      1.34 -2.22   0.962 -0.332  1.65  0.750  0.674   63.6  0.543
#> 5     5 S     C      1.80 -0.165  2.16  -0.285  3.14  1.09   2.21   496.   1.16 
#> 6     6 S     T      2.14  0.250  2.44  -0.219  3.36  1.16   2.31   911.   1.20 
#> # ... with 3 more variables: la <dbl>, lacm <dbl>, lacmd <dbl>

我已成功运行map function 以创建 12 个模型的列表(我们称之为“models_1”):

models_1 <- map(df[,4:15], ~(lm(.x ~df$edge*df$trt)))

现在,我想使用map2创建第二组模型,它们引用我创建的第一组模型。 我不断收到“映射向量必须具有一致长度”的错误,即使我在map2中调用的列数等于“models_1”中的模型数:

sim <- df %>%
  group_by(edge) %>%
  map2(df[, 4:15], models_1, ~(anova_test(.x~ df$trt, error = .y, type = 3)))

我收到以下错误:

Error: Mapped vectors must have consistent lengths:
* `.x` has length 15
* `.y` has length 12

这是我想做的一个工作示例(这仅适用于一个 model,但我有 12 个以上,所以如果可能的话,我想使其自动化):

model <- lm(nl ~ edge*trt, data = df)

df %>%
  group_by(edge) %>%
  anova_test(nl ~ trt, error = model, type = 3)

reprex package (v0.3.0) 于 2020 年 5 月 19 日创建

这是您或多或少想做的事情吗?

library(tidyverse)
library(rstatix)


df <- tibble::tribble(
  ~id, ~edge, ~trt,         ~nl,          ~lm,         ~md,           ~c,        ~mgg,       ~mgcm,          ~p,         ~sp,         ~ap,         ~la,       ~lacm,      ~lacmd,
  1L,   "S",  "C", 1.802500944, -1.126394361, 1.747757193, -0.302911966, 2.942376992,  1.01978392, 1.603508872, 1166.214587, 1.104182097, 3.630403855, 0.925433649, 2.083967271,
  2L,   "S",  "T",          NA,           NA,          NA,           NA,          NA,          NA,          NA,          NA,          NA,          NA,          NA,          NA,
  3L,   "D",  "C",  1.59505822, -1.554475881, 1.173922711, -0.340665184, 1.854642163, 0.787036727,  1.40878277,  663.125567, 0.898799413, 3.332281129, 0.803131628, 1.841247752,
  4L,   "D",  "T", 1.342572531,  -2.21548947, 0.961702527, -0.331617331, 1.645569808, 0.750246559,  0.67441638, 63.63830862, 0.542966439, 2.416127169, 0.574963833, 1.529239129,
  5L,   "S",  "C", 1.802500944, -0.165110402, 2.162768585, -0.285160482, 3.136984959, 1.093832043, 2.209960854,   495.84715, 1.164570199, 4.799142774, 0.994423991, 2.034565573,
  6L,   "S",  "T", 2.141481291,  0.250369615, 2.439863935, -0.218925863, 3.358891011, 1.163094493,  2.30563155, 910.5631088, 1.198833277, 5.219802305, 1.097357732, 2.149000371
)


models_1 <- map(df[,4:15], ~ (lm(.x ~ edge * trt, data = df)))
models_2 <- map(df[,4:15], ~ (lm(.x ~ trt, data = df)))
purrr::map2(models_2, models_1, ~ anova_test(.x, error = .y, type = 3))

#> $nl
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd            F        p p<.05 ges
#> 1    trt   1   1 2.929636e+28 3.72e-15     *   1
#> 
#> $lm
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05   ges
#> 1    trt   1   1 0.003 0.965       0.003
#> 
#> $md
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd        F     p p<.05      ges
#> 1    trt   1   1 0.000496 0.986       0.000496
#> 
#> $c
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05 ges
#> 1    trt   1   1 8.964 0.205       0.9
#> 
#> $mgg
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F    p p<.05   ges
#> 1    trt   1   1 1.286 0.46       0.562
#> 
#> $mgcm
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05   ges
#> 1    trt   1   1 0.046 0.866       0.044
#> 
#> $p
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd    F     p p<.05   ges
#> 1    trt   1   1 0.41 0.637       0.291
#> 
#> $sp
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05   ges
#> 1    trt   1   1 0.443 0.626       0.307
#> 
#> $ap
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd      F     p p<.05   ges
#> 1    trt   1   1 22.512 0.132       0.957
#> 
#> $la
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05   ges
#> 1    trt   1   1 0.019 0.914       0.018
#> 
#> $lacm
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd     F     p p<.05   ges
#> 1    trt   1   1 2.578 0.355       0.721
#> 
#> $lacmd
#> ANOVA Table (type III tests)
#> 
#>   Effect DFn DFd      F     p p<.05   ges
#> 1    trt   1   1 21.387 0.136       0.955

感谢来自 rstudio 社区论坛的 Nirgrahamuk 的回答:

map(names(models_1) ,
    ~ anova_test(data=group_by(df,edge),
                 formula = as.formula(paste0(.x,"~ trt")),
                 error = models_1[[.x]],
                 type = 3))

(查看他们的完整答案: https://community.rstudio.com/t/trouble-using-group-by-and-map2-together/66730/8?u=mvula

由 reprex package (v0.3.0) 于 2020 年 5 月 20 日创建

暂无
暂无

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

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