如何从purrr::map2获得“整洁”的结果?

如何从purrr::map2获得“整洁”的结果?,r,tidyr,purrr,broom,R,Tidyr,Purrr,Broom,给定包含两个不同变量重复测量值的数据框,即A1、A2、B1、B2 如何使用函数式编程原理在相同变量的前、后对其进行迭代,并获得一个整洁的结果?以下是我的尝试: bef <- select(my_df, contains("BEFORE")) aft <- select(my_df, contains("AFTER")) result <- map2(bef, aft, t.test, paired = T) 上面的结果是多个嵌套列表。我怎样才能得到一个整洁的结果 result

给定包含两个不同变量重复测量值的数据框,即A1、A2、B1、B2

如何使用函数式编程原理在相同变量的前、后对其进行迭代,并获得一个整洁的结果?以下是我的尝试:

bef <- select(my_df, contains("BEFORE"))
aft <- select(my_df, contains("AFTER"))
result <- map2(bef, aft, t.test, paired = T)
上面的结果是多个嵌套列表。我怎样才能得到一个整洁的结果

result <- tidy(map2(bef, aft, t.test, paired = T))
结果我们可以使用map_df,因为它是一个列表

或者更紧凑

map2_df(bef, aft, ~tidy(t.test(.x, .y, paired = TRUE)))
我们可以使用map_df,因为它是一个列表

或者更紧凑

map2_df(bef, aft, ~tidy(t.test(.x, .y, paired = TRUE)))

这里有另一种方法,在进行t检验之前整理数据。显然,我们得到了相同的结果,但这种方法在最终输出中标记了正在测试的变量

仅更改数据-添加id变量以索引重复测量

除dplyr外,还需要扫帚和tidyr

使用tidyr进行重组

my_tidy_df <- my_df %>% 
  mutate(id = row_number()) %>% # needs an id to group repeated measure
  gather(var, value, -id) %>% 
  extract(var, c("var", "timepoint"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
  spread(timepoint, value) 
然后,您可以对每个变量运行t-test,如下所示:

my_tidy_df %>% 
  group_by(var) %>% 
  do(broom::tidy(t.test(.$BEFORE, .$AFTER, data=., paired=T)))
结果:

# Groups:   var [4]
    var    estimate  statistic   p.value parameter   conf.low conf.high        method alternative
  <chr>       <dbl>      <dbl>     <dbl>     <dbl>      <dbl>     <dbl>        <fctr>      <fctr>
1    A1  0.16014628  0.3470400 0.7365381         9 -0.8837567 1.2040493 Paired t-test   two.sided
2    A2 -0.99798993 -1.6271640 0.1381451         9 -2.3854407 0.3894609 Paired t-test   two.sided
3    B1  0.04916586  0.1289803 0.9002097         9 -0.8131436 0.9114753 Paired t-test   two.sided
4    B2 -0.06919212 -0.1833619 0.8585784         9 -0.9228233 0.7844391 Paired t-test   two.sided

这里有另一种方法,在进行t检验之前整理数据。显然,我们得到了相同的结果,但这种方法在最终输出中标记了正在测试的变量

仅更改数据-添加id变量以索引重复测量

除dplyr外,还需要扫帚和tidyr

使用tidyr进行重组

my_tidy_df <- my_df %>% 
  mutate(id = row_number()) %>% # needs an id to group repeated measure
  gather(var, value, -id) %>% 
  extract(var, c("var", "timepoint"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
  spread(timepoint, value) 
然后,您可以对每个变量运行t-test,如下所示:

my_tidy_df %>% 
  group_by(var) %>% 
  do(broom::tidy(t.test(.$BEFORE, .$AFTER, data=., paired=T)))
结果:

# Groups:   var [4]
    var    estimate  statistic   p.value parameter   conf.low conf.high        method alternative
  <chr>       <dbl>      <dbl>     <dbl>     <dbl>      <dbl>     <dbl>        <fctr>      <fctr>
1    A1  0.16014628  0.3470400 0.7365381         9 -0.8837567 1.2040493 Paired t-test   two.sided
2    A2 -0.99798993 -1.6271640 0.1381451         9 -2.3854407 0.3894609 Paired t-test   two.sided
3    B1  0.04916586  0.1289803 0.9002097         9 -0.8131436 0.9114753 Paired t-test   two.sided
4    B2 -0.06919212 -0.1833619 0.8585784         9 -0.9228233 0.7844391 Paired t-test   two.sided

你能解释为什么在最终整理中需要do吗?在按var对数据帧进行分组后,do会对每个组重复操作-结果必须是数据帧,因此需要使用t.test result对象的broom::tidy提取。你能解释为什么在最终整理中需要do吗?在按var对数据帧进行分组后,do对每个组重复该操作-结果必须是数据帧,因此需要使用t.test result对象的broom::tidy提取。