将一行数据框中的子字符串替换为同一行中另一列的值

时间:2016-09-08 21:15:05

标签: r

我有名为new_sgs的字符列的数据框,如下所示:

     SG.Name RegionCode
1 AW02PASGA001         01
2 AW02PASGA002         01
3 AW02PASGA003         01
4 AW02PASGA004         01
5 AW02PASGA005         01
6 AW02PASGA006         01
...

我想用第2列中的字符串替换第1列的字符串中的'02'。这可以完成第1行的工作:

new_sgs$SG.Name[1] <- gsub("AW02", paste0("AW", new_sgs$RegionCode[1]), new_sgs$SG.Name[1])

有没有办法使用其中一个应用函数对每一行进行此更改?我试过了

sapply(new_sgs, function(x) gsub("AW02", paste0("AW", new_sgs$RegionCode[x]), new_sgs$SG.Name[x]))

但这就是我得到的:

    SG.Name RegionCode
[1,] NA      NA        
[2,] NA      NA        
[3,] NA      NA        
[4,] NA      NA        
[5,] NA      NA        
[6,] NA      NA 
...
Warning messages:
1: In gsub("AW02", paste0("AW", test$RegionCode[x]), test$SG.Name[x]) :
  argument 'replacement' has length > 1 and only the first element will be used
2: In gsub("AW02", paste0("AW", test$RegionCode[x]), test$SG.Name[x]) :
  argument 'replacement' has length > 1 and only the first element will be used

谢谢!

2 个答案:

答案 0 :(得分:2)

如果可以保证您要替换的字符串位于名称的第3位和第4位,则可以使用substr

substr(df$SG.Name, 3, 4) <- df$RegionCode
df
#       SG.Name RegionCode
#1 AW01PASGA001         01
#2 AW01PASGA002         01
#3 AW01PASGA003         01
#4 AW01PASGA004         01
#5 AW01PASGA005         01
#6 AW01PASGA006         01

或者,您可以将submapply

一起使用
df$SG.Name = mapply(function(rc, nam) sub("\\d+", nam, rc), df$RegionCode, df$SG.Name, USE.NAMES = F)

答案 1 :(得分:2)

来自stringr包的

str_replace()将在模式上进行矢量化并根据需要进行替换。见下面的例子:

library(stringr)

x <- data.frame(
  SG.Name = c("AW02PASGA001", "AW02PASGA002", "AW02PASGA003"),
  RegionCode = c("01", "01", "01")
)

str_replace(x$SG.Name, "02", x$RegionCode)
#> [1] "AW01PASGA001" "AW01PASGA002" "AW01PASGA003"