2

基本的には、文字列のベクトルと検索語を入力として受け取り、ブールベクトルを出力する関数を作成しようとしています。この後、文字列のリストを取得し、これを同じ関数で実行して、文字列ごとに1つずつ、複数の結果ベクトルを出力したいと思います。

したがって、初期データは次のようになります。

> searchVector <- cbind(c("aaa1","aaa2","","bbb1,aaa1,ccc1", "ddd1,ccc1,aaa1"))
> searchVector
     [,1]         
[1,] "aaa1"        
[2,] "aaa2"        
[3,] ""           
[4,] "bbb1,aaa1,ccc1"
[5,] "ddd1,ccc1,aaa1"

これが私たちが見たいものです:

>findTrigger(c("aaa","bbb"),searchVector)
         [aaa]  [bbb]
    [1,] 1     0   
    [2,] 1     0   
    [3,] 0     0      
    [4,] 1     1
    [5,] 1     0

私は次の試みをしました:

searchfunction <- function (searchTerms, searchVector) {
  output = matrix( nrow = length(searchVector), 
             ncol = length(searchTerms), 
             dimnames = searchTerms)

  for (j in seq(1,length(searchTerms)))
  {
    for (i in seq(1,length(searchVector)))
    { 
      output[i,j]=is.numeric(pmatch(searchTerms[j], searchVector[i]))
    }
  }
  return(as.numeric(output))
}

しかし、私はすべて1の行列を取得します。私はRにかなり慣れておらず、オンラインで見回しましたが、運がありませんでした。どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

2

重要なのは、関数を使用することgreplです。これで始められるはずです:

searchVector <- c("aaa1","aaa2","","bbb1,aaa1,ccc1", "ddd1,ccc1,aaa1")

res <- lapply(c('aaa','bbb'),function(pattern,x) as.numeric(grepl(pattern = pattern,x = x)),x = searchVector)
do.call(cbind,res)

これを少し調べるには、次のことから始めますgrepl

> grepl('aaa',searchVector)
[1]  TRUE  TRUE FALSE  TRUE  TRUE
> as.numeric(grepl('aaa',searchVector))
[1] 1 1 0 1 1

次にlapply、 vector をループするために、 でそれをまとめていますc('aaa','bbb')。これにより、ベクトルのリストが返され、それを結合して、 および を使用して指定した行列にしdo.callますcbind

于 2012-11-15T19:09:07.503 に答える
1

mapplyおよびgrepまたはgrepl(joranに感謝)はあなたの友達です:

searchTerms <- c("aaa", "bbb")
searchVector <- cbind(c("aaa1","aaa2","","bbb1,aaa1,ccc1", "ddd1,ccc1,aaa1"))
M <- mapply(grepl, searchTerms, MoreArgs=list(x=searchVector)) 
M
       aaa   bbb
[1,]  TRUE FALSE
[2,]  TRUE FALSE    
[3,] FALSE FALSE
[4,]  TRUE  TRUE
[5,]  TRUE FALSE

あなたがそれを望むなら1,0apply(M,2,as.numeric)

于 2012-11-15T19:23:02.753 に答える