Пересчитать статистику после lapply - PullRequest
1 голос
/ 22 мая 2019

У меня есть фрейм данных с несколькими столбцами и двумя разными группами - см. Ниже.

set.seed(123) 
d <- data.frame(
  q1 = rnorm(20),
  q2 = rnorm(20),
  q3 = rnorm(20),
  group = sample(c("A", "B"), size = 20, replace = TRUE))

Я использую lapply для вычисления ttest для каждого столбца между двумя группами, как указано ниже:

lapply(d[,-4], function(i) t.test(i ~ d$group))

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

$q1

    Welch Two Sample t-test

data:  i by d$group
t = -0.76262, df = 17.323, p-value = 0.4559
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.2294678  0.5759458
sample estimates:
mean in group A mean in group B 
    -0.05443279      0.27232820 

Я хочу повторить основную статистическую информацию (t, df, pvalue) как отдельную таблицу для каждого столбца (q1, q2, q3 ...)

1 Ответ

1 голос
/ 22 мая 2019

Вы можете снова использовать lapply() для извлечения каждого параметра и bind_rows():

library(dplyr)
lapply(l, function(x) {
  data.frame(t = x$statistic,
             df = x$parameter,
             pv = x$p.value) # returns a dataframe for each element in l
}) %>% bind_rows()

#           t        df         pv
# 1 -1.031983 13.533116 0.32017136
# 2 -2.458574  9.771018 0.03427922
# 3  1.421821 11.416813 0.18181697

Вы можете сделать это за один снимок:

lapply(d[,-4], function(i) {
  res <- t.test(i ~ d$group)
  data.frame(t = res$statistic,
             df = res$parameter,
             pv = res$p.value)
  }) %>% bind_rows()

Если выхотите сохранить ссылку на имена столбцов, передайте .id в bind_rows():

lapply(d[,-4], function(i) {
  res <- t.test(i ~ d$group)
  data.frame(t = res$statistic,
             df = res$parameter,
             pv = res$p.value)
}) %>% bind_rows(.id='id')
#   id          t       df        pv
# 1 q1 -0.7626249 17.32329 0.4559469
# 2 q2 -1.6467070 17.73117 0.1172263
# 3 q3  0.5288851 13.01589 0.6057874

Пример:

set.seed(123) 
d <- data.frame(
  q1 = rnorm(20),
  q2 = rnorm(20),
  q3 = rnorm(20),
  group = sample(c("A", "B"), size = 20, replace = TRUE))
l <- lapply(d[,-4], function(i) {
  t.test(i ~ d$group)

  })
...