使用模式列表参数对数据帧进行子集的功能

时间:2012-09-07 02:08:22

标签: regex r function dataframe

我有一个模式列表

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

1 个答案:

答案 0 :(得分:2)

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

在你的函数中,它正在查找名为column

的列\ named元素

这里使用`[[`

要简单得多

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

?`$`中的相关行

  

两者[[和$选择列表中的单个元素。主要区别在于$不允许计算指数,而[[确实如此]。 x $ name相当于x [[“name”,exact = FALSE]]。此外,[[可以使用精确参数控制。

的部分匹配行为

您正尝试将valuecolumn用作计算索引(即计算 value和{{1} }被定义为),因此你需要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的对象(在您的情况下是全局环境。