【问题标题】:Write a function that returns a vector or list of three statistics编写一个返回三个统计量的向量或列表的函数
【发布时间】:2017-01-11 16:36:03
【问题描述】:

这是学校的问题,但我已经研究了几个小时,只需要指出正确的方向。我不是要完整的答案。

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

我得到了以下框架:

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 入门课程,所以代码应该相当简单,但我已经为这个问题开发了一个心理障碍。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: r list function vector mean


    【解决方案1】:

    因为给你的功能框架,我们不得不使用它。

    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)]等了。即使你想要这个逻辑,你也可以试试@987654329 @。阅读?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
    

    还可能值得指出您的代码有问题的地方:

    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])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2012-08-31
      • 2023-04-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多