我试图通过将最终数据集中的所有变量都保留在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
。其次,取6
和1
并计算该学生的平均值(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
,但打开了其他所有解决方案。预先感谢!
我们可以使用mutate
代替summarise
,因为summarise
返回每个组1行的汇总输出,而mutate
在数据集中创建新列
...
%>%
mutate(mean.time = mean(time))
[如果我们要获取mean
的mean
,则首先按'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)