0

次の変数があると仮定します。

a <- c('one','two','three')
b <- c('one|on','two|wo',"three|thre")
c <- c('there is one','there one is ','there is one three two')

そして、次の結果を持つ新しい変数が必要です。

 d
 [1] "one"   "one"   "three"

私がやろうとしているのは、たとえばoneorという単語onがテキストに含まれているかどうかを確認oneし、新しい変数に新しい値を割り当てることですdaまた、階層に複数の値がある場合は、最後の値から取得する必要があります。

私にできることは次のとおりです。

d <- list()
d[grepl(b[1],c)] <- a[1]
d[grepl(b[2],c)] <- a[2]
d[grepl(b[3],c)] <- a[3]
d <- unlist(d)

単純なループでも同じことができます。しかし、他にもっとエレガントな方法はありますか?

4

1 に答える 1

0

それほどエレガントではありませんが、この関数はあなたが望むことをします:

funny_replace <- function(c, b, a) {

   max_or_null <- function(x) {
      if (length(x) != 0) max(x) else NULL
   }

   multi_grep <- function(b, x) {
      which(sapply(b, grepl, x))
   }

   replace_one <- function(s, b, a) {
      a[max_or_null(multi_grep(b, s))]
   }

   unlist(sapply(c, replace_one, b, a)) 
}
funny_replace(c, b, a)
#      there is one          there one is  there is one three two 
#             "one"                  "one"                "three" 

次のように動作します:max_or_nullベクトルの最大値を返すために使用されるかNULL、ベクトルが空の場合は を返します。これはc、 のパターンがb一致しない の要素が正しく処理されるようにするために後で使用されます。

multi_grep単一の文字列で複数のパターンを検索し (通常の grep は逆のことを行います: 複数の文字列で 1 つのパターン)、見つかったパターンのインデックスを返します。

replace_oneは単一の文字列を取り、 のどのパターンbが を使用して見つかったかをチェックしmulti_grepます。次にmax_or_null、これらのインデックスの最大値を返すか、何も一致しない場合は NULL を返します。最後に、このインデックスを持つ要素が から選択されaます。

replace_one次に、 の各要素に適用してc、目的の結果を取得します。

繰り返し割り当てを回避するため、これはあなたのものや for ループよりも機能的なソリューションだと思います。一方で、少し複雑なようです。

ところで、コードをあなたの例に合わせやすくするためにa、 、b、およびどこでも使用しました。cただし、これは良い方法とは言えません。

于 2015-11-19T19:49:40.977 に答える