0

我有一个模式列表

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
4

1 回答 1

2

问题是您对`$`运算符的使用。

在您的函数中,它正在查找名为 \ 的列元素column

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

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

中的相关行?`$`

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

您正在尝试使用valuecolumn作为计算索引(即计算value和定义column为),因此您需要`[[`.

函数变为

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父环境中某处存在的名为的对象(在您的情况下是全局环境。

于 2012-09-07T02:16:11.283 回答