2016-05-01 27 views
0

我試圖以行方式基於data.frame中另一列的大字符串剪切/移除一個字符串。使用R中的另一列在data.frame中逐行移除字符串string 0

例如,在此data.frame col2應從col1

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

的結果是

  col1  col2 
1  A123 45  Testz 
2  66 55  Test2 

我曾嘗試的sub變化移除

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

但是這會導致

Warning message: In sub(kat1$col2, " ", kat1$col1) : argument 'pattern' has length > 1 and only the first element will be used 

因此,我正在考慮如何使用REGEX中的列以行方式替換這些元素。

回答

4

subgsub不能矢量化pattern(見?gsub)。如果你正在尋找既簡單和效率,儘量stringi(或stringr這是一個stringi包裝)

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,No.只需在控制檯輸入'str_replace_all'並查看源代碼。通過「包裝」我的意思是它只是僞裝下的相同代碼。與用C/C++編寫的'stringi'相比。 –

相關問題