如何在函数中包含辅助函数,以便使用前缀从data.frame中查找和更改数据?还需要计算并使用循环

时间:2016-09-27 18:25:07

标签: r function loops dataframe stringr

这是一个关于学校的问题,但我已经研究了一段时间,只需要一个正确的方向。我不是要求完整的答案。

我获得了一个包含学生成绩的数据框,用于各种评估。我必须编写一个函数,该函数将为提供名称的评估产生权重(作为总成绩100%的一部分)。该函数需要包含至少一个辅助函数。

我首先提供了以下运行代码行,class()定义为函数:

assessmentTypeWeights <- c(5,15,5,3,2,10,10,10,40)
names(assessmentTypeWeights) <- c("quiz","hw","term1","term2","term3",
                                  "exam1","exam2","exam3","final")

然后我还获得了以下帮助函数:

assessmentPrefix <- function(assessmentName,assessmentTypeWeights)
    {
        if(assessmentName %in% names(assessmentTypeWeights))
        {
            return(assessmentName)
        }else
        {
            # find the prefix of the assessment name
            # by removing the last digit
            prefix <- substring(assessmentName,1,nchar(assessmentName)-1)
            return(prefix)
        }
    }

最后,我的答案提供了以下框架:

assessmentWeight <- function(df, assessmentName, assessmentTypeWeights)
    {
         #includes helper function "assessmentPrefix"    

    }

此外,我已经为上一个问题编写了以下函数:

library(stringr)

assessmentCount <- function(df, assessmentNamePrefix)
{
  sum(str_detect(names(df), assessmentNamePrefix))
}

我需要能够在上面给出的框架中编写assessmentWeight函数的代码,以便在执行以下代码行时获得下面的确切结果:

assessmentWeight(df,"quiz1",assessmentTypeWeights)
# quiz 
# 0.8333333 

assessmentWeight(df,"term1",assessmentTypeWeights)
# term1 
# 5

这就是我写的:

assessmentWeight <- function(df, assessmentName, assessmentTypeWeights)
{
  assessmentPrefix(assessmentName, assessmentTypeWeights)
      #determines prefix from name of assessment

  assessmentCount(assessmentPrefix)
      #determines number of columns in data.frame starting with that prefix

  assessmentTypeWeights(assessmentPrefix)
      #determines the assessment type weight based on the prexix

  myAssessmentWeight <- (assessmentTypeWeights / assessmentCount) * 100
      #adjusts the assessment type weight to be percentage of 100%

  return(assessmentPrefix, myAssessmentWeight)
      #returns the assessment prefix and its weight as part of 100%    
}

但是,当我运行此代码时,收到以下错误消息:

 Error in type(pattern) : 
  argument "assessmentNamePrefix" is missing, with no default

当然,我不知道这是否是代码的唯一问题,我不知道如何修复它。我已经浏览了互联网和三本不同的书,但却无法弄清楚我需要改变什么。

我想我可能需要在某处包含函数(?)names()?或许我完全偏离轨道?

非常感谢任何帮助。提前感谢您的时间。

2 个答案:

答案 0 :(得分:1)

我能看到的一些事情:

assessmentPrefix正在返回一个值,但您并未将该值(使用<-)分配给要再次使用的任何内容。

您的assessmentCount函数需要两个参数,并且您只提供一个参数,将assessmentPrefix作为df参数传递。鉴于您稍后再次尝试使用此结果,您需要使用该函数return()一个值并将其分配给要在myAssessmentWeight中引用的对象。

此外,根据您所描述的内容,assessmentTypeWeights是一个向量,而不是一个函数,因此一旦修复上面的代码,代码行也会返回错误。

希望有所帮助,可以让你朝着正确的方向前进!

仅供参考,如果您可以在输入数据结构中包含一些细节以及您认为输出应该是什么样的,那么您将获得更多帮助。

答案 1 :(得分:0)

我终于明白了。我怀疑它是最简洁或最好的fomatted代码,但它确实有用。

assessmentWeight <- function(df, assessmentName, assessmentTypeWeights)
{
    myPrefix <- assessmentPrefix(assessmentName, assessmentTypeWeights)

    myWeight <- assessmentTypeWeights[myPrefix]

    myCols <- assessmentCount(df, myPrefix)

    myAssessmentWeight <- (myWeight / myCols)

    return(myAssessmentWeight)
}