r - 在函数中使用 dplyr::filter()

标签 r dplyr

我刚刚开始学习如何编写自己的函数,我正在尝试编写 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(). 时得到的结果相同。 。我想做到这一点一定很容易,但我不知道它会是什么。

最佳答案

下面是函数的修改版本,应该可以满足您的期望。我更改了参数studentstudent_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/

相关文章:

r - r-markdown 文档的在线编译器

R计算事件日前后的天数

r - 创建新列以显示 dplyr 中字符串的部分匹配

r - 将列表应用于输出数据帧的函数

r - 创建两个分类变量和数值变量的数据透视表

R:dplyr 条件汇总并按列重新编码值

r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?

c# - 有什么方法可以从R中调用.NET的字符串库吗?

r - 从 ls() 结果中隐藏函数名称 - 更快地找到变量名称

r - 在 R 中的不同 Y 轴上向条形图添加线条