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))
}
这是学校的问题,但我已经研究了几个小时,只需要指出正确的方向。我不是要完整的答案。
我得到了一个数据框,其中包含用于各种评估的学生成绩。我必须编写一个函数来生成以给定前缀开头或完全匹配名称的列数。
我得到了以下框架:
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))
}