编写一个返回向量或三个统计列表的函数

时间:2016-09-03 21:15:56

标签: r list function vector mean

这是一个关于学校的问题,但我一直在努力工作几个小时,只需要一个正确的方向。我不是要求完整的答案。

我获得了一个包含学生成绩的数据框,用于各种评估。我必须编写一个函数,该函数将生成一个向量或列表,该函数或列表将给出一个特定评估的最小值,最大值和平均值。

我获得了以下框架:

checkAssessment <- function(df, assessmentName)
{

}

我需要能够编写代码,以便在执行以下代码行时获得下面的确切结果:

checkAssessment(df,"hw1")
# $min
# [1] 0
# 
# $max
# [1] 14
# 
# $avg
# [1] 12.58824

所以,我已经尝试了很多方法来解决这个问题,其中没有一个有效。最接近的两个是

checkAssessment <- function(df, assessmentName)
{
my_min <- df$assessmentName == min(assessmentName)
my_max <- df$assessmentName == max(assessmentName)
my_avg <- df$assessmentName == mean(assessmentName)
return(df[my_min, ])
return(df[my_max, ])
return(df[my_avg, ])
}

checkAssessment <- function(df, assessmentName)
{
my_min <- sapply(df$assessmentName, min)
my_max <- sapply(df$assessmentName, max)
my_avg <- sapply(mean.default(df$assessmentName, trim = 0, na.rm = FALSE,         
...))
funs = c(min, max, mean)
return(df[my_min, ])
return(df[my_max, ])
return(df[my_avg, ])
}

我甚至不确定我是否接近其中任何一个。我在R课程中,所以代码应该相当简单,但我已经开发了一个带有这个问题的心理障碍。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:5)

因为你被赋予了功能框架,所以我们必须使用它。

checkAssessment <- function(df, assessmentName)
{
x <- df[[assessmentName]]  ## extract column vector
return(list(min = min(x), max = max(x), avg = mean(x)))  ## use a list for multiple return
}

注意:

  1. 通过匹配列名称(确切地)从数据框中提取列,使用[[]]。可以使用$,但它会进行部分匹配;也许this answer可以帮助您理解这个概念;
  2. 了解R-base函数minmaxmean,这样您就不需要与x[x == min(x)]等进行斗争。即使你想要这个逻辑,你可以尝试x[which.min(x)]。请阅读?which.min了解更多信息;
  3. 如果您想要多个返回值,请使用&#34;列表&#34;收集所有这些。设置列表的基本方法类似于list(1, 2),但列表可以包含名称,因此请与list(a = 1, b = 2)进行比较。
  4. <强>测试

    我们使用R的内置数据集trees进行测试。

    checkAssessment(trees, "Height")
    #$min
    #[1] 63
    
    #$max
    #[1] 87
    
    #$avg
    #[1] 76
    

    也许值得指出代码存在问题的地方:

    checkAssessment <- function(df, assessmentName)
    {
    my_min <- df$assessmentName == min(assessmentName)
    my_max <- df$assessmentName == max(assessmentName)
    my_avg <- df$assessmentName == mean(assessmentName)
    return(df[my_min, ])
    return(df[my_max, ])
    return(df[my_avg, ])
    }
    

    首先,min(assessmentName)没有意义。也许你想要

    df$assessmentName == min(df$assessmentName)
    

    然后,return(df[my_min, ])返回一个数据帧,一行但多列。也许你想要:

    return(df[my_min, assessmentName])
    

    最后,在上述return之后,以下内容无效:

    return(df[my_max, assessmentName])
    return(df[my_avg, assessmentName])
    

    因为该函数在看到第一次返回后终止。这就是你应该使用&#34;列表&#34;获得多个返回值。