У меня есть фрейм данных с несколькими столбцами и двумя разными группами — см. ниже.
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...)
Вы можете снова использовать 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)
})
Знаете ли вы, как сообщать о colnames?
Забудьте об этом, смотрите мое обновление, для .id
есть параметр bind_rows()
, который дает то, что вы хотите.
вы можете избежать
bind_rows
, используяsapply
?data.frame(sapply(d[,-4], function(i) { res <- t.test(i ~ d$group); c(t = res$statistic, df = res$parameter, pv = res$p.value) }))