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]]ているものを使用します。columncolumn

関連する行は次の?`$`とおりです。

[[ と $ はどちらも、リストの 1 つの要素を選択します。主な違いは、$ は計算されたインデックスを許可しないのに対し、[[ は許可することです。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

于 2012-09-07T02:16:11.283 に答える