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

Tit*_*552 1 r function list vector mean

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

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

我得到了以下框架:

checkAssessment <- function(df, assessmentName)
{

}
Run Code Online (Sandbox Code Playgroud)

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

checkAssessment(df,"hw1")
# $min
# [1] 0
# 
# $max
# [1] 14
# 
# $avg
# [1] 12.58824
Run Code Online (Sandbox Code Playgroud)

所以,我已经尝试了很多方法来解决这个问题,但没有一个方法可行.最接近的两个是

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, ])
}
Run Code Online (Sandbox Code Playgroud)

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, ])
}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将非常感谢.谢谢.

李哲源*_*李哲源 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
}
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 通过匹配列名称(确切地)从数据框中提取列,使用[[]].可以使用$,但它可以进行部分匹配; 也许这个答案可以帮助你理解这个概念;
  2. 注意R-base功能min,max以及mean你不需要挣扎x[x == min(x)]等等.即使你想要这个逻辑,你也可以试试x[which.min(x)].阅读?which.min更多;
  3. 如果您想要多个返回值,请使用"列表"来收集所有这些值.设置列表的基本方法是list(1, 2),但列表可以有名称,所以比较list(a = 1, b = 2).

测试

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

checkAssessment(trees, "Height")
#$min
#[1] 63

#$max
#[1] 87

#$avg
#[1] 76
Run Code Online (Sandbox Code Playgroud)

您可能还需要指出代码存在问题的地方:

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, ])
}
Run Code Online (Sandbox Code Playgroud)

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

df$assessmentName == min(df$assessmentName)
Run Code Online (Sandbox Code Playgroud)

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

return(df[my_min, assessmentName])
Run Code Online (Sandbox Code Playgroud)

最后,经过上述操作后return,以下内容不会产生任何影响:

return(df[my_max, assessmentName])
return(df[my_avg, assessmentName])
Run Code Online (Sandbox Code Playgroud)

因为该函数在看到第一次返回后终止.这就是为什么你应该使用"列表"来获取多个返回值.