2016-05-01 9 views
0

data.frameの別の列に基づいて、大きな文字列から行を切り捨てようとしています。例えばR内の別の列を使用してdata.frame内の文字列を文字列から削除する

は、このdata.frameにcol2結果は

  col1  col2 
1  A123 45  Testz 
2  66 55  Test2 

あるとcol1

kat1 <- data.frame(col1 = c("A123Testz45", "66Test255"), col2 = c("Testz", "Test2")) 

から除去されなければならない私は

kat1$col1 <- sub(kat1$col2, " ", kat1$col1) 

subのバリエーションを試みましたこれはになります

Warning message: In sub(kat1$col2, " ", kat1$col1) : argument 'pattern' has length > 1 and only the first element will be used 
このように、私はREGEXで列を使用して、これらの要素を行ごとに置き換える方法を考えています。

答えて

4

subおよびgsubは、pattern?gsub参照)をベクター化できない。あなたは、シンプルさと効率の両方を探している場合は、(stringiラッパーですかstringrstringiを試してみてください

with(kat1, stringi::stri_replace_all_fixed(col1, col2, " ")) 
# [1] "A123 45" "66 55" 

ベースRを使用して、apply

apply(kat1, 1, function(x) sub(x[["col2"]], " ", x[["col1"]], fixed = TRUE)) 
# [1] "A123 45" "66 55" 
のようなものを使用して(非効率的に)それを行うことができます

@docendoによるより良いベースRの提案は、行列変換を避けるために、ベクトル上でmapplyを使用することです。

transform(kat1, col1 = mapply(sub, col2, " ", col1, fixed = TRUE)) 
#  col1 col2 
# 1 A123 45 Testz 
# 2 66 55 Test2 
+0

私は 'stringr'が基本関数のラッパーであると思っていました。そうじゃないの? –

+0

完全に動作します。デイビッド、ありがとう! – user5835099

+0

@docendodiscimus、いいえ。コンソールに 'str_replace_all'と打ち込んでソースコードをチェックしてください。 「ラッパー」とは、変わったコードと同じコードであることを意味します。 C/C++で書かれた 'stringi'と比較します。 –