【问题标题】:Function to subset dataframe using pattern list argument使用模式列表参数对数据帧进行子集化的函数
【发布时间】:2012-09-07 02:08:22
【问题描述】:

我有一个模式列表

patternlist <- list('one' = paste(c('a','b','c'),collapse="|"), 'two' = paste(1:5,collapse="|"), 'three' = paste(c('k','l','m'),collapse="|"))

我想从中选择以从数据框中提取行

dataframez <- data.frame('letters' = c('a','b','c'), 'numbers' = 1:3, 'otherletters' = c('k','l','m'))

有这个功能

pattern.record <- function(x, column="letters", value="one")
{
  if (column %in% names(x))
  {
   result <- x[grep(patternlist$value, x$column, ignore.case=T),]
  }
  else
  {
    result <- NA
  }
  return(result)
}

奇怪的是,当我运行它时出现错误:

> pattern.record(dataframez)
 Error in grep(patternlist$value, x$column, ignore.case = T) : 
  invalid 'pattern' argument

【问题讨论】:

    标签: regex r function dataframe


    【解决方案1】:

    问题在于您使用了`$` 运算符。

    在你的函数中,它正在寻找一个名为column 的列\命名元素

    这里使用`[[`要简单得多

    然后x[[column]] 使用column 的定义,而不是column 作为名称。

    ?`$`中的相关行是

    [[ 和 $ 都选择列表的单个元素。主要区别在于 $ 不允许计算索引,而 [[ 允许。 x$name 等价于 x[["name", exact = FALSE]]。此外,[[ 的部分匹配行为可以使用精确参数来控制。

    您正在尝试将valuecolumn 用作计算索引(即计算valuecolumn 被定义为),因此您需要`[[`

    函数变成

    pattern.record <- function(x, column="letters", value="one", pattern_list)
    {
      if (column %in% names(x))
      {
        result <- x[grep(pattern_list[[value]], x[[column]], ignore.case=T),]
      }
      else
      {
        result <- NA
      }
      return(result)
    }
    
    pattern.record(dataframez, patternlist = pattern_list)
    
    ##   letters numbers otherletters
    ## 1       a       1            k
    ## 2       b       2            l
    ## 3       c       3            m
    

    请注意,我还添加了一个参数pattern_list,因此它不依赖于父环境中某处存在的名为patternlist 的对象(在您的情况下是全局环境。

    【讨论】:

    • 实际上 R is 解析column ...它只是没有评估column。否则我完全同意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多