2

データフレームの各行に対して各要素をチェックしたいベクトルがあります。チェックする要素が他のテキストに埋め込まれているため、grep 関数が必要です。

このフォーラムの助けを借りて、次のコードを取得しました。

    mat=data.frame(par=c('long A story','C story', 'blabla D'),val=1:3) 
    vec=c('Z','D','A')
    mat$label <- NA
    for (x in vec){
       is.match <- lapply(mat$par,function(y) grep(x, y))
       mat$label[which(is.match > 0)] <- x
    }

問題は、実行に数分かかることです。これをベクトル化する方法はありますか?

4

1 に答える 1

3

それぞれの場合で最初の一致のみが必要であると想定しました。

which.matches <- grep("[ZDA]", mat$par)
what.matches <- regmatches(mat$par, regexpr("[ZDA]", mat$par))

mat$label[which.matches] <- what.matches
mat

           par val label
1 long A story   1     A
2      C story   2  <NA>
3     blabla D   3     D

編集:ベンチマーク

Unit: microseconds
           expr     min       lq  median       uq      max
1   answer(mat) 185.338 194.0925 199.073 209.1850  898.919
2 question(mat) 672.227 693.9610 708.601 725.6555 1457.046

編集2:

@mrdwabが示唆したように、これは実際にはワンライナーとして使用できます。

mat$label[grep("[ZDA]", mat$par)] <- regmatches(mat$par, regexpr("[ZDA]", mat$par))
于 2012-08-01T09:01:33.020 に答える