将dataframe的一列中的子字符串替换为同一行中另一列的值
我有一个名为new_sgs的字符列数据框,如下所示:将dataframe的一列中的子字符串替换为同一行中另一列的值,r,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行的工作:
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])
但我得到的是:
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
谢谢
Luke如果保证要替换的字符串位于名称的3和4位置,则可以使用substr:
如果保证要替换的字符串位于名称的3和4位置,则可以使用substr: 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"
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"
可能重复的可能重复的感谢!对于简单向量解决方案和帮助我了解mapply的使用,我给予了额外的奖励。注意:我必须在子函数中颠倒nam和rc的顺序才能使其正常工作。谢谢!对于简单向量解决方案和帮助我了解mapply的使用,我给予了额外的奖励。注意:我必须在子函数中颠倒nam和rc的顺序才能使其正常工作。
df$SG.Name = mapply(function(rc, nam) sub("\\d+", nam, rc), df$RegionCode, df$SG.Name, USE.NAMES = F)
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"