2017-06-02 1 views
2

私は比較したい文字列を持つデータフレームに2つの列を持っています。最初の文字列は文字列のベクトルで、2番目の文字列は各要素の文字列のミニベクトルを持つリストです。このようなデータフレームを持っている想像:文字列リストの各要素とRのベクトルの各文字列の一致を見つける( 'for'を避ける)

V     L 
"Anameone"  "name" "asd" 
"Bnametwo"   "dfg" 
"Cnamethree" "hey" "C" "hi" 

言葉のいくつかの第二の要素であれば、私は、Lの最初の要素内の単語の一部がVの最初の要素に現れるかどうかを確認したいと思いますLの2番目の要素にLのようなものが現れます。出力されるように

for (i in c(1:3)){ df$matches[i] <- any(df$L[[i]],grepl, df$V[i],ignore.case = T)) }

私は、このようなループを望んで行うことができ

> df$matches 
[1] "TRUE" "FALSE" "TRUE" 

しかし、実際に私の周り100.000代わりに3の行を持って、それ本当に長くかかります。私はこれをもっと効率的にやっていく方法を考え出すことができませんでした。索引を使用しない私の他の試みはすべて、この例では3x3のマトリックスになります。なぜなら、「すべてをすべて」と比較するからです。

答えて

0

あなたはlの各要素はstringr::str_detect()vにある場合は両方の列、テストを反復処理するためにpurrr::map2_lgl()を使用して、任意の一致があるかどうかだけTRUEFALSEを取得するためにany()を使用することができます。

library(dplyr) 
library(purrr) 
library(stringr) 

df <- tibble(
    v = c("Anameone", "Bnametwo", "Cnamethree"), 
    l = list(c("name", "asd"), "dfg", c("hey", "C", "hi")) 
) 

mutate(df, matches = map2_lgl(v, l, ~ str_detect(.x, .y) %>% any())) 

#> # A tibble: 3 x 3 
#>   v   l matches 
#>  <chr> <list> <lgl> 
#> 1 Anameone <chr [2]> TRUE 
#> 2 Bnametwo <chr [1]> FALSE 
#> 3 Cnamethree <chr [3]> TRUE 
0

sapply作業をする必要があります:あなたはそれがループのために使用するよりも高速ですかどうかを確認する必要があります

df<-data.frame(V=c("Anameone","Bnametwo","Cnamethree"), 
      L=I(list(c("name","asd"),"dfg",c("hey","C","hi")))) 


sapply(as.character(df$V),function(x) 

{grepl(paste(unlist(df$L[1]),collapse="|"),x)}) 

。私はあなたの例を再現できませんでした。

+0

これはdf $ Lの最初の要素のみを使用しているため、 "name"はV要素のそれぞれに存在するため、すべてのTrueを返すようになっています。要素ごとに要素をVとLの両方をチェックする何かを書かなければならないでしょう。 –

+0

はい、そうです。テスト用にそれを持ち、削除するのを忘れました。私は別の亀裂があります。 – Chris

1

このような何か?

関連する問題