R: sub() 使用向量作为模式

R: sub() using vector as pattern

假设我有一个如下所示的数据框:

df=data.frame(a=LETTERS, b=paste0(LETTERS,1:length(LETTERS)))

看起来像这样:

> df
   a   b
1  A  A1
2  B  B2
3  C  C3
4  D  D4
5  E  E5
6  F  F6
7  G  G7
8  H  H8
9  I  I9
10 J J10
11 K K11
12 L L12
...

我唯一想做的就是从 df$b 中删除 df$a,这样生成的数据框如下所示:

> df
   a  b
1  A  1
2  B  2
3  C  3
4  D  4
5  E  5
6  F  6
7  G  7
8  H  8
9  I  9
10 J 10
11 K 11
12 L 12
...

为此,我想明确地使用 sub()df$a 作为模式。这个数据框只是一个例子,所以我不想在 sub() 中使用 strsplit() 或特定的正则表达式(因为我的 df$a 会变得非常复杂)。

我试试:

df$b=sub(paste0("^",df$a) , "", df$b)

但显然我得到:

Warning message: In sub(paste0("^", df$a), "", df$b) : argument 'pattern' has length > 1 and only the first element will be used

那么正确的做法是什么?谢谢!

使用 mapplydf$b 中删除 df1$a

df <- data.frame(a=LETTERS, b=paste0(LETTERS,1:length(LETTERS)))

mapply(\(x, y) sub(x, "", y), df$a, df$b)
#>    A    B    C    D    E    F    G    H    I    J    K    L    M    N    O    P 
#>  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "10" "11" "12" "13" "14" "15" "16" 
#>    Q    R    S    T    U    V    W    X    Y    Z 
#> "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"

reprex package (v2.0.1)

于 2022-03-16 创建

要分配回 df$b,保持字符,运行

df$b <- mapply(\(x, y) sub(x, "", y), df$a, df$b)
head(df)
#>   a b
#> 1 A 1
#> 2 B 2
#> 3 C 3
#> 4 D 4
#> 5 E 5
#> 6 F 6

reprex package (v2.0.1)

于 2022-03-16 创建