R - 输入前缀时计算数据框中列数的函数
Posted
技术标签:
【中文标题】R - 输入前缀时计算数据框中列数的函数【英文标题】:R - Function to count the number of columns in a data frame when a prefix is entered 【发布时间】:2016-09-05 20:17:24 【问题描述】:这是学校的问题,但我已经研究了几个小时,只需要指出正确的方向。我不是要完整的答案。
我收到了一个数据框,其中包含学生在各种评估中的成绩。我必须编写一个函数来生成以给定前缀开头或完全匹配名称的列数。
我得到了以下框架:
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 编程课程的开始阶段。有人可以指出我正确的方向吗?将不胜感激。谢谢你:)
【问题讨论】:
你需要学习一些正则表达式。当您使用[exam1]
时,这将匹配方括号之间的任何字母。你可以改用grep("^exam1", c("exam1", "exam2", "exam3"))
。正如上面评论中提到的 - 只需在 grepl
上使用 sum
。
谢谢你们。我不知道为什么我一直跳过简单的代码并认为它必须更难。我一直想把所有东西都分解成小块,然后分析这些小块。当然,步骤越多,错误就越多。我会重新阅读 re: 正则表达式。谢谢:)
另见***.com/questions/31467732/…
@DavidArenburg 谢谢,我会看看的。
那很不幸。
【参考方案1】:
您可以使用基本的startsWith()
函数,在这种情况下,它比正则表达式grepl("^<prefix>", x)
更快更方便,从?startsWith()
指定:
startsWith() 等价于但比
快得多substring(x, 1, nchar(prefix)) == prefix or also
grepl("^prefix", x)
assessmentCount <- function(df, assessmentNamePrefix)
sum(startsWith(names(df), assessmentNamePrefix))
【讨论】:
这很好,但由于某种原因我无法访问startsWith()
。知道为什么吗?
旧 R 版本 :) ... 更新到 3.3.1 后它可以工作了。
startsWith(x, prefix)
和 endsWith(x, suffix)
在 R 3.3.0 中引入。【参考方案2】:
您的正则表达式出现错误。 我认为应该是:
sum(grepl(paste0("^",assessmentNamePrefix),names(df)))
【讨论】:
以上是关于R - 输入前缀时计算数据框中列数的函数的主要内容,如果未能解决你的问题,请参考以下文章