通过将数据集中的所有变量保留在r中来计算均值

问题描述 投票:1回答:1

我试图通过将最终数据集中的所有变量都保留在dplyr包中来计算时间平均值。这是我的样本数据集的样子:

library(dplyr)
id <-     c(1,1,1,1, 2,2,2,2, 3,3,3,3, 4,4,4,4)
gender <- c(1,1,1,1, 2,2,2,2, 2,2,2,2, 1,1,1,1)
item.id <-c(1,1,1,2, 1,1,2,2, 1,2,3,4, 1,2,2,3)
sequence<-c(1,2,3,1, 1,2,1,2, 1,1,1,1, 1,1,2,1)
time <-   c(5,6,7,1, 2,3,4,9, 1,2,3,9, 5,6,7,8)
data <- data.frame(id, gender, item.id, sequence, time)
> data
   id gender item.id sequence time
1   1      1       1        1    5
2   1      1       1        2    6
3   1      1       1        3    7
4   1      1       2        1    1
5   2      2       1        1    2
6   2      2       1        2    3
7   2      2       2        1    4
8   2      2       2        2    9
9   3      2       1        1    1
10  3      2       2        1    2
11  3      2       3        1    3
12  3      2       4        1    9
13  4      1       1        1    5
14  4      1       2        1    6
15  4      1       2        2    7
16  4      1       3        1    8

id代表学生ID,gender代表性别,item.id代表学生接受的问题ID,sequence是解决问题的尝试次数,因为学生可能会回到问题并再次回答,time是每次试用所花费的时间。

[计算时间平均值时,我需要遵循三个步骤:

(a)学生针对每个问题进行了多次试验。我需要为每个具有多次试验的项目计算时间平均值。

(b)然后计算每个id的时间的总体平均值。例如,对于id=1,我有两个项目,第一个项目有3个试验,第二个项目有1个试验。首先,我需要通过(5+6+7)/3=6汇总第一项的时间,因此id=1具有项1时间6和项2时间1。其次,取61并计算该学生的平均值(6+1)/2=3.5

(c)最后,我想将所有变量保留在数据集中。

 data <- data %>%
          group_by(id) %>%
          select(id, gender, item.id, sequence, time) %>%
          summarize(mean.time = mean(time))

我知道了,但是很明显,这只是在不考虑每次试验的均值的情况下汇总均值,而且也没有保留所有变量:

> data
# A tibble: 4 x 2
     id mean.time
  <dbl>     <dbl>
1     1      4.75
2     2      4.5 
3     3      3.75
4     4      6.5 

我以为select()将保留所有变量。

最终数据集应如下所示:

> data
   id gender item.id sequence time  mean.time
1   1      1       1        1    5    3.5
2   1      1       1        2    6    3.5
3   1      1       1        3    7    3.5
4   1      1       2        1    1    3.5
5   2      2       1        1    2    4.5
6   2      2       1        2    3    4.5
7   2      2       2        1    4    4.5
8   2      2       2        2    5    4.5
9   3      2       1        1    1    3.75
10  3      2       2        1    2    3.75
11  3      2       3        1    3    3.75
12  3      2       4        1    9    3.75
13  4      1       1        1    5    6.5
14  4      1       2        1    6    6.5
15  4      1       2        2    7    6.5
16  4      1       3        1    8    6.5

我使用了dplyr,但打开了其他所有解决方案。预先感谢!

r aggregate
1个回答
2
投票

我们可以使用mutate代替summarise,因为summarise返回每个组1行的汇总输出,而mutate在数据集中创建新列

...
  %>% 
      mutate(mean.time = mean(time))

[如果我们要获取meanmean,则首先按'id','item.id'进行分组,获取mean,然后按'id'进行分组,获取mean unique个元素

data %>%
   group_by(id, item.id) %>% 
   mutate(mean.time = mean(time)) %>% 
   group_by(id) %>% 
   mutate(mean.time = mean(unique(mean.time)))
# A tibble: 16 x 6
# Groups:   id [4]
#      id gender item.id sequence  time mean.time
#   <dbl>  <dbl>   <dbl>    <dbl> <dbl>     <dbl>
# 1     1      1       1        1     5      3.5 
# 2     1      1       1        2     6      3.5 
# 3     1      1       1        3     7      3.5 
# 4     1      1       2        1     1      3.5 
# 5     2      2       1        1     2      4.5 
# 6     2      2       1        2     3      4.5 
# 7     2      2       2        1     4      4.5 
# 8     2      2       2        2     9      4.5 
# 9     3      2       1        1     1      3.75
#10     3      2       2        1     2      3.75
#11     3      2       3        1     3      3.75
#12     3      2       4        1     9      3.75
#13     4      1       1        1     5      6.5 
#14     4      1       2        1     6      6.5 
#15     4      1       2        2     7      6.5 
#16     4      1       3        1     8      6.5 

或使用summarise,然后执行left_join

data %>%
  group_by(id, item.id) %>%
  summarise(mean.time = mean(time)) %>%
  group_by(id) %>%
  summarise(mean.time = mean(mean.time)) %>%
  right_join(data)
© www.soinside.com 2019 - 2024. All rights reserved.