R - 输入前缀时计算数据框中列数的函数

R - Function to count the number of columns in a data frame when a prefix is entered

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

我得到了一个数据框,其中包含用于各种评估的学生成绩。我必须编写一个函数来生成以给定前缀开头或完全匹配名称的列数。

我得到了以下框架:

assessmentCount <- function(df, assessmentNamePrefix)
{

}

我需要能够编写代码以在执行以下代码行时获得以下准确结果:

assessmentCount(df,"hw")
# [1] 7

assessmentCount(df,"exam1")
# [1] 1

我发现下面的代码,当 运行 独立于框架并写入 [hw] 时,给出了正确的数字 7:

my_columns <- df[, grep("^[hw]", names(df), value=TRUE)]
ncol(my_columns)

但是,当我对 [exam1] 执行相同操作时,我得到的数字 3 不正确,因为它包括 exam1、exam2 和 exam3 的列:

my_columns <- df[, grep("^[exam1]", names(df), value=TRUE)]
ncol(my_columns)

更糟糕的是,当我将代码放入框架并用变量 assessmentNamePrefix 替换值时,我得到的两个测试的值都是错误的 8。

assessmentCount <- function(df, assessmentNamePrefix)
{
  my_columns <- df[, grep("^[assessmentNamePrefix]", names(df), value=TRUE)]
  ncol(my_columns)  
}

此时我非常沮丧,不明白出了什么问题。我确实意识到这是一个非常基本的问题,但我正处于非常基础的 R 编程课程的开始阶段。有人可以指出我正确的方向吗?将不胜感激。谢谢:)

您的正则表达式似乎有误。 我觉得应该是:

sum(grepl(paste0("^",assessmentNamePrefix),names(df)))

您可以使用基础 startsWith() 函数,在这种情况下,它比正则表达式 grepl("^<prefix>", x) 更快更方便,如 ?startsWith():

所指定

startsWith() is equivalent to but much faster than

substring(x, 1, nchar(prefix)) == prefix or also

grepl("^prefix", x)

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