Я пытаюсь привыкнуть к использованию tidyverse
.Я не знаю, подходят ли мои данные для использования таких функций, как map()
.Мне нравится организация списков-столбцов, поэтому мне интересно, как использовать комбинацию group_by()
, summarize()
, map()
и другие функции, чтобы заставить это работать.Я знаю, как использовать эти функции с векторными столбцами, но не знаю, как к этому подойти в случае столбцов списка.
Пример данных:
library(tidyverse)
set.seed(3949)
myList <- replicate(12, sample(1:20, size = 10), simplify = FALSE)
tibble(
group = rep(c("A", "B"), each = 6),
data = myList
)
Каждый вектор в списке-column имеет десять элементов, которые являются значениями для данного испытания.То, что я хотел бы сделать, это сгруппировать тиббл по group
, а затем найти среднее значение «столбец» и se расширенных списков.Другими словами, я воспринимаю столбцы списка как матрицу, в которой каждая строка таблицы связана вместе.Вывод будет содержать столбцы для группы и испытаний, поэтому он будет в правильном формате для ggplot2
.
mean se group trial
1 6.000000 1.6329932 A 1
2 12.666667 2.3333333 A 2
3 12.333333 2.8007935 A 3
4 13.833333 1.8150605 A 4
5 8.166667 3.1028661 A 5
6 11.500000 2.9410882 A 6
7 13.666667 2.3758040 A 7
8 6.833333 1.7779514 A 8
9 11.833333 2.3009660 A 9
10 8.666667 1.7061979 A 10
11 8.333333 1.6865481 B 1
12 12.166667 2.6002137 B 2
13 10.000000 2.7080128 B 3
14 11.833333 3.1242777 B 4
15 4.666667 1.2823589 B 5
16 12.500000 3.0413813 B 6
17 6.000000 1.5055453 B 7
18 8.166667 1.6616591 B 8
19 11.000000 2.6708301 B 9
20 13.166667 0.9457507 B 10
Вот как я обычно делаю что-то вроде этого:
set.seed(3949)
data.frame(group = rep(c("A", "B"), each = 6)) %>%
cbind(replicate(12, sample(1:20, size = 10)) %>% t()) %>%
split(.$group) %>%
lapply(function(x) data.frame(mean = colMeans(x[ ,2:11]),
se = apply(x[ ,2:11], 2, se))) %>%
do.call(rbind,.) %>%
mutate(group = substr(row.names(.), 1,1),
trial = rep(1:10, 2)) %>%
ggplot(aes(x = trial, y = mean)) +
geom_point() +
geom_line() +
facet_grid(~ group) +
scale_x_continuous(limits = c(1,10), breaks = seq(1, 10, 1)) +
geom_errorbar(aes(ymin = mean-se, ymax = mean+se), color = "black") +
theme_bw()
Есть ли более чистый способ сделать это с помощью функций tidyverse
?