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("^&lt;prefix&gt;", 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 - 输入前缀时计算数据框中列数的函数的主要内容,如果未能解决你的问题,请参考以下文章

代码返回列名,但Kotlin中列数为零

Informix:计算临时表中的列数?

什么函数允许我根据R中列中的值从数据框中的列中提取数据?

使用 R [重复] 更改数据框中列的顺序

重命名数据框中列中的字符变量 - R

给定列名,数据框中列的平均值