簡體   English   中英

通過purrr和dplyr按組對小標題列表列的每個元素進行均值

[英]Mean across each element of a tibble list-column by group with purrr and dplyr

我試圖習慣使用tidyverse 我不知道我的數據是否非常適合使用諸如map()類的函數。 我喜歡列表列的組織,所以我想知道如何使用group_by()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
)

列表列中的每個向量都有十個元素,它們是給定試驗的值。 我想做的是按組對小標題進行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函數是否有更干凈的方法可以做到這一點?

我認為另一種方法是使用nest()map()

library(tidyverse)
library(plotrix) #For the std.error

# Your second sample dataset
set.seed(3949)
df <- data.frame(group = rep(c("A", "B"), each = 6)) %>%
  cbind(replicate(12, sample(1:20, size = 10)) %>% t()) 


df %>% 
  nest(-group) %>% 
  mutate(mean = map(data, ~rowMeans(.)), 
         se = map(data, ~ plotrix::std.error(t(.))), 
         trial = map(data, ~ seq(1, nrow(.)))) %>%
  unnest(mean, se, trial) %>% 
  ggplot(aes(x = trial, y = mean)) +
  geom_point() +
  geom_line() +
  facet_grid(~ group) +
  geom_errorbar(aes(ymin = mean-se, ymax = mean+se), color = "black") + 
  theme_bw()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM