这是一个关于学校的问题,但我一直在努力工作几个小时,只需要一个正确的方向。我不是要求完整的答案。
我获得了一个包含学生成绩的数据框,用于各种评估。我必须编写一个函数,该函数将生成一个向量或列表,该函数或列表将给出一个特定评估的最小值,最大值和平均值。
我获得了以下框架:
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课程中,所以代码应该相当简单,但我已经开发了一个带有这个问题的心理障碍。
非常感谢任何帮助。谢谢。
答案 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
}
注意:
[[]]
。可以使用$
,但它会进行部分匹配;也许this answer可以帮助您理解这个概念; min
,max
和mean
,这样您就不需要与x[x == min(x)]
等进行斗争。即使你想要这个逻辑,你可以尝试x[which.min(x)]
。请阅读?which.min
了解更多信息; list(1, 2)
,但列表可以包含名称,因此请与list(a = 1, b = 2)
进行比较。<强>测试强>
我们使用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;获得多个返回值。