使用 R 中的另一列从 data.frame 中的字符串中按行删除字符串

use*_*099 1 regex r dataframe

我正在尝试以行方式基于 data.frame 中的另一列从较大字符串中剪切/删除字符串。

例如,在此 data.frame 中col2应从中删除col1

kat1 <- data.frame(col1 = c("A123Testz45", "66Test255"), col2 = c("Testz", "Test2"))
Run Code Online (Sandbox Code Playgroud)

结果是

          col1     col2
1     A123 45     Testz
2       66 55     Test2
Run Code Online (Sandbox Code Playgroud)

我尝试过subwith的变体

kat1$col1 <- sub(kat1$col2, " ", kat1$col1)
Run Code Online (Sandbox Code Playgroud)

但这会导致

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

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

Dav*_*urg 5

sub并且gsub无法矢量化pattern(请参阅?gsub)。如果您正在寻找简单性和效率,请尝试stringi(或者stringr这是一个stringi包装器)

with(kat1, stringi::stri_replace_all_fixed(col1, col2, " "))
# [1] "A123 45" "66 55"   
Run Code Online (Sandbox Code Playgroud)

使用基本 R,您可以使用 来完成(效率低下)apply,例如

apply(kat1, 1, function(x) sub(x[["col2"]], " ", x[["col1"]], fixed = TRUE))
# [1] "A123 45" "66 55" 
Run Code Online (Sandbox Code Playgroud)

@docendo 的一个更好的基本 R 建议是mapply在向量上使用以避免矩阵转换

transform(kat1, col1 = mapply(sub, col2, " ", col1, fixed = TRUE))
#      col1  col2
# 1 A123 45 Testz
# 2   66 55 Test2
Run Code Online (Sandbox Code Playgroud)