2017-08-30 14 views
0

文字列に基づいて新しい列を作成したい。作成することはできますが、一致しない列も作成しています。例:文字列と一致しない列の作成を避ける

 x = data.frame(name = c("Java Hackathon", "Intro to Graphs", "Hands on 
      Cypher")) 
     toMatch <- c("Hackathon","Hands on","Test","java") 


     ##Sentence with phrases 
     phrases11 <- as.vector(toMatch) 
     res <- sapply(phrases11, grepl, x = as.character(x$name),ignore.case= 
     TRUE) 
     rownames(res) <- x$name 

     #replacement 
     ones <- which(res==1, arr.ind=T) 
     res[ones]<-colnames(res)[ones[,2]] 
     res 

     Output: 
         Hackathon Hands on  Test  java 
    Java Hackathon  "Hackathon" "FALSE" "FALSE" "java" 
    Intro to Graphs "FALSE"  "FALSE" "FALSE" "FALSE" 
    Hands on Cypher "FALSE"  "Hands on" "FALSE" "FALSE" 

私はマッチングのための膨大なデータを持っているので、「テスト」列を作成したくありません。したがって、基本的にはres <- sapply(phrases11, grepl, x = as.character(x$name), ignore.case = TRUE)でコードの変更を行うことができるので、 'toMatch'ベクトルと一致する列を作成するだけですか?他のアプローチはありますか?

+0

は 'do.call(CBIND、フィルター(ネゲート(is.null)で試してみてくださいif(any(i1))i1})、フレーズ11)))setNames(lapply(phrases11、function(y){i1 akrun

答えて

0

あなたは真または偽与えgrepl()機能を使用しているので、あなたは合計= 0の列を排除することができます。

A=sapply(toMatch,grepl,as.character(x$name),ignore.case=T) 
    A[,colSums(A)==1] 
    Hackathon Hands on java 
[1,]  TRUE FALSE TRUE 
[2,]  FALSE FALSE FALSE 
[3,]  FALSE  TRUE FALSE 
関連する問題