2017-01-03 10 views
0

文字列を抽出したい文字ベクトルがあります。私はループを使用してそれを達成することができますが、同じものを使用せずに同じことができるかどうか疑問に思っていました。私が持っているコードを使って、サンプルベクトルを含めました。ループを使用せずにベクトルから文字列を抽出する

I必要な出力になるように各ベクトルの最初の要素を抽出する
egVec = c("a - (2),bewc", "c,d,e","efd, ejw, qdn", "we3, asw - 23") 

Vec1 
    [1] "a - (2)" "c" "efd" "we3" 

ループに使用するマイコード:

Vec1 = as.character(0) 
for (i in 1:length(egVec)){ 
    SplitVec = unlist(strsplit(egVec[i], ",")) 
    Vec1[i] = SplitVec[1] 
} 
+4

@hrbrmstr:これは本当によくある質問ですか?もしそうなら、この質問は標準的な質問のための最良の候補ですか? –

+0

私が以下に述べたように。フォークはタグを自由に取り外すことができます。それは私のオパインです。それは他のオパインよりもあまり意味がありませんが、私はそれを主張していません。 – hrbrmstr

答えて

4
library(purrr) 
library(stringi) 

egVec <- c("a - (2),bewc", "c,d,e","efd, ejw, qdn", "we3, asw - 23") 

strsplit(egVec, ",") %>% 
    vapply(`[`, character(1), 1)      # type-safe base R 
## [1] "a - (2)" "c"  "efd"  "we3" 

strsplit(egVec, ",") %>% 
    sapply(`[`, 1)         # non-type-safe base R 
## [1] "a - (2)" "c"  "efd"  "we3" 

strsplit(egVec, ",") %>% 
    map_chr(1)          # type-safe tidyvere 
## [1] "a - (2)" "c"  "efd"  "we3" 

stri_split_fixed(egVec, ",", 2, simplify=TRUE)[,1] # stringi one-liner splitting strings 
## [1] "a - (2)" "c"  "efd"  "we3" 

gsub(",.*$", "", egVec)       # base R one-liner string replacing 
## [1] "a - (2)" "c"  "efd"  "we3" 

stri_replace_first_regex(egVec, ",.*$", "")  # stringi one-liner string replacing 
## [1] "a - (2)" "c"  "efd"  "we3" 

ベンチマーク:

library(microbenchmark) 
library(ggplot2) 

microbenchmark(
    vapply=strsplit(egVec, ",") %>% vapply(`[`, character(1), 1), 
    sapply=strsplit(egVec, ",") %>% sapply(`[`, 1), 
    map_chr=strsplit(egVec, ",") %>% map_chr(1), 
    stri_split=stri_split_fixed(egVec, ",", 2, simplify=TRUE)[,1] , 
    gsub=gsub(",.*$", "", egVec), 
    stri_replace=stri_replace_first_regex(egVec, ",.*$", "") 
) -> mb 

mb 
## Unit: microseconds 
##   expr  min  lq  mean median  uq  max neval cld 
##  vapply 109.657 140.6025 169.51454 159.9715 181.4645 1102.825 100 b 
##  sapply 125.206 147.8225 176.49470 172.4420 196.8730 396.046 100 b 
##  map_chr 123.767 145.7385 179.12090 177.9535 198.2710 325.098 100 b 
## stri_split 6.626 12.7120 15.60843 14.6755 17.6315 68.299 100 a 
##   gsub 13.912 20.5335 24.99184 23.8180 28.1800 45.563 100 a 
## stri_replace 17.532 25.8590 30.81416 28.9465 31.0715 170.869 100 a 

autoplot(mb) 

enter image description here

(未最適なテストベンチマーク用のハーネスが、私はstri_split…を考え出しWLD上に出てきます)。

また、私はgsub()を使用することにも慣れており、sub()を使用するのを忘れてしまいました。それはgsub()とほとんど同じベンチマークを持っています。しかし、stri_replace_first_regex()との比較のためにsub()を使用する方がより公平です。

+0

私の悪いです。筋肉の記憶は 'stri_'です。あなたが好きでない場合は、タグを削除してください。私はあなたと別の奇妙な戦争に入るつもりはない。それは私の時間/エネルギーの価値がない。 – hrbrmstr

+0

あなたが暴言ではなく編集を行った可能性があります。それは対応する価値がない大きな理由の1つです。 – hrbrmstr