2016-09-08 3 views
0

У меня есть dataframe столбцов символов имени new_sgs, который выглядит следующим образом:Заменить подстроку в одном столбце dataframe со значением другого столбца в одном ряду

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

Я хочу заменить «02» в строках столбца 1 со строкой в ​​столбце2. Это делает работу для ряда 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 

Спасибо!

Люк

+1

Возможной Дубликат [R: GSUB, шаблон = вектор и вектор замены =] (http://stackoverflow.com/questions/19424709/r-gsub-pattern-vector-and-replacement -vector) – aosmith

ответ

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 

В качестве альтернативы вы можете использовать sub с mapply:

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

Спасибо! I Дополнительный кредит как для простого векторного решения, так и для того, чтобы помочь мне разобраться в использовании mapply. Примечание. Мне пришлось отменить порядок nam и rc в подфункции, чтобы заставить его работать правильно. – Luke

2

str_replace() из пакета stringr будет vectorise над шаблон и замену по мере необходимости. Смотрите пример ниже:

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" 
+0

Спасибо, ясное и простое решение! – Luke

Смежные вопросы