我刚刚开始学习如何编写自己的函数,我正在尝试编写 compute_means
用于非常特定类型的数据框的函数。这个question看起来很相似,但它没有得到答案,而且我还没有找到任何其他似乎可以解决这个问题的东西。
我的数据看起来像这样:
student <- c("alw", "alw", "bef", "bef")
semester <- c("autumn", "spring", "autumn", "spring" )
test1 <- c(87, 88, 90, 78)
test2 <- c(67, 78, 81, 88)
x <- data.frame(student, semester, test1, test2)
我希望能够编写一个函数,在其中可以计算平均值,可以按学期分组,也可以按学生和学期分组,或者仅针对单个学生分组。我可以让学生小组工作,但是当我尝试计算单个学生的测试分数的平均值时,我遇到了困难。这是我到目前为止所拥有的(有问题的部分是 else if
部分):
compute_means <- function(df, student = NA, separate = FALSE){
if (!separate & is.na(student)){
df %>%
group_by(semester) %>%
summarise(count = n(), test1 = mean(test1), test2 = mean(test2)) %>%
mutate(students = c("AllStudnts")) %>%
select(students, semester: test2)
}
else if(!separate & !is.na(student)){
df %>%
filter(student == student) %>%
group_by(semester) %>%
summarise(count = n(), test1 = mean(test1), test2 = mean(test2)) %>%
mutate(student = student)
}
else{
df %>%
group_by(student, semester) %>%
summarise(count = n(), test = mean(test1), test2 = mean(test2))
}
}
compute_means(x)
做我认为会做的事情:我按学期得到所有学生的平均值。 compute_means(x, separate = TRUE)
也做了我认为会做的事。然而,compute_means(x, student = "alw")
没有做我想的那样。而不是得到 alw
,我得到的结果与没有 filter().
时得到的结果相同。 。我想做到这一点一定很容易,但我不知道它会是什么。
最佳答案
下面是函数的修改版本,应该可以满足您的期望。我更改了参数student
至student_name
。我还删除了尾随的 mutate(student = student)
因为看起来不需要,我添加了一个管道到 ungroup
删除剩余的分组,因为它们可能不需要。
compute_means <- function(df, student_name = NA, separate = FALSE){
if (!separate & is.na(student_name)){
df %>%
group_by(semester) %>%
summarise(count = n(), test1 = mean(test1), test2 = mean(test2)) %>%
mutate(students = c("AllStudnts")) %>%
select(students, semester: test2)
}
else if(!separate & !is.na(student_name)){
df %>%
filter(student == student_name) %>%
group_by(semester) %>%
summarise(count = n(), test1 = mean(test1), test2 = mean(test2))
}
else{
df %>%
group_by(student, semester) %>%
summarise(count = n(), test = mean(test1), test2 = mean(test2)) %>%
ungroup # added since you don't need the remaining grouping.
}
}
从输入 x
开始
> x
student semester test1 test2
1 alw autumn 87 67
2 alw spring 88 78
3 bef autumn 90 81
4 bef spring 78 88
这是使用对函数 compute_means
的各种调用的输出
> compute_means(x)
Source: local data frame [2 x 5]
students semester count test1 test2
(chr) (fctr) (int) (dbl) (dbl)
1 AllStudnts autumn 2 88.5 74
2 AllStudnts spring 2 83.0 83
> compute_means(x, separate = TRUE)
Source: local data frame [4 x 5]
Groups: student [?]
student semester count test test2
(fctr) (fctr) (int) (dbl) (dbl)
1 alw autumn 1 87 67
2 alw spring 1 88 78
3 bef autumn 1 90 81
4 bef spring 1 78 88
> compute_means(x, student_name = 'alw')
Source: local data frame [2 x 4]
semester count test1 test2
(fctr) (int) (dbl) (dbl)
1 autumn 1 87 67
2 spring 1 88 78
> compute_means(x, student_name = 'bef')
Source: local data frame [2 x 4]
semester count test1 test2
(fctr) (int) (dbl) (dbl)
1 autumn 1 90 81
2 spring 1 78 88
编辑
类似 filter(student == student)
的情况发生了什么? (在OP的代码中)是在过滤器的上下文中,项目 student
是对 student
的引用在df
,在 ==
的两侧,而不是函数参数。
关于r - 在函数中使用 dplyr::filter(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843898/