R Добавить количество элементов в таблице - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу добавить количество значений в таблицу t-тестов.Вот мой пример кода:

library(broom)
library(purrr)

t1 <- t.test(rnorm(50), rnorm(60))
t2 <- t.test(rnorm(60), rnorm(70, 1))
t3 <- t.test(rnorm(80), rnorm(90, 2))

Теперь я превращаю их в один фрейм данных (который затем можно распечатать как таблицу) с пакетами метлы и мурлыкания, и я получаю эту таблицу:

tab <- map_df(list(t1, t2, t3), tidy)
tab %>% select(-parameter, -conf.low, -conf.high, -method, -alternative)

# A tibble: 3 x 5
estimate estimate1 estimate2 statistic  p.value
 <dbl>     <dbl>     <dbl>     <dbl>    <dbl>
1  -0.0542    -0.178    -0.123    -0.260 7.95e- 1
2  -1.24      -0.214     1.03     -6.48  1.88e- 9
3  -2.30      -0.231     2.07    -14.6   2.81e-31

А теперь я хочу добавить 2 новых столбца с номером x и числом y.Вот мой желаемый результат:

# A tibble: 3 x 5
  estimate estimate1 estimate2 statistic  p.value  number_of_x  number_of_Y
 <dbl>     <dbl>     <dbl>     <dbl>    <dbl>
1  -0.0542    -0.178    -0.123    -0.260 7.95e- 1      50          60
2  -1.24      -0.214     1.03     -6.48  1.88e- 9      60          70
3  -2.30      -0.231     2.07    -14.6   2.81e-31      80          90

Может ли кто-нибудь помочь мне создать этот финальный стол?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Поскольку t.test не возвращает информацию о длине x или y, ее необходимо сохранить в том месте, где вы запускаете t.test:

library(tidyverse)

params <- list(xn  = c(50, 60, 80),
               xmu = rep(0, 3),
               yn  = c(60, 70, 90),
               ymu = 0:2)

raw_data <- pmap(params, function(xn, xmu, yn, ymu) list(x = rnorm(xn, xmu),
                                                         y = rnorm(yn, ymu)))

map_dfr(raw_data, function(l) {
  tt <- t.test(l$x, l$y)
  tidy(tt) %>% 
     select(-parameter, -conf.low, -conf.high, -method, -alternative) %>%
     mutate(number_of_x = length(l$x),
            number_of_y = length(l$y))
}) 
# A tibble: 3 x 7
#   estimate estimate1 estimate2 statistic  p.value number_of_x number_of_y
#      <dbl>     <dbl>     <dbl>     <dbl>    <dbl>       <int>       <int>
# 1    0.260    0.144     -0.115      1.38 1.71e- 1          50          60
# 2   -1.16    -0.0414     1.12      -6.24 6.25e- 9          60          70
# 3   -1.67     0.129      1.79     -10.6  4.14e-20          80          90

Примечание. Для того, чтобы сделать это в цикле, я сохранил все входные векторы в raw_data, так что вы можете извлечь информацию из длины элементов.

0 голосов
/ 27 февраля 2019

Можно предварительно сохранить 'n', создав функцию

library(tidyverse)
f1 <- function(n1, n2, mean1 = 1) {

 list(t.test(rnorm(n1), rnorm(n2, mean = mean1)),
     tibble(number_of_x = n1, number_of_y = n2))

 }

t1 <- f1(50, 60)
t2 <- f1(60, 70, 1)
t3 <- f1(80, 90, 2)
map2_df(list(t1[[1]], t2[[1]], t3[[1]]), list(t1[[2]],
       t2[[2]], t3[[2]]), ~ 
   tidy(.x) %>%
         select(-parameter, -conf.low, -conf.high, -method, -alternative) %>%
         bind_cols(.y))
# A tibble: 3 x 7
#  estimate estimate1 estimate2 statistic  p.value number_of_x number_of_y
#     <dbl>     <dbl>     <dbl>     <dbl>    <dbl>       <dbl>       <dbl>
#1   -0.723    0.348       1.07     -3.77 2.67e- 4          50          60
#2   -1.25    -0.216       1.03     -7.32 2.54e-11          60          70
#3   -2.07     0.0433      2.11    -13.0  3.01e-27          80          90

или используя pmap

list(t1, t2, t3) %>% 
     transpose %>% 
     pmap_df(~ tidy(.x) %>% 
        select(-parameter, -conf.low, -conf.high, -method, -alternative) %>%
        bind_cols(.y))

ПРИМЕЧАНИЕ. Выходные значения будутотличается, так как set.seed не указано

...