2015-03-04 1 views
3

Я хочу заменить первый элемент строк в x пустым, если он удовлетворяет условию: если первый элемент из «101» в x соответствует первой строке в y , замените первый элемент «101» на пустой.Заменить первый элемент строки в R на основании условия

x = c("101", "201", "301") 
y = c("1", "7", "3") 

Want:

> x 
[1] "01" "201" "01" 

Я пытался:

> ifelse(substr(x, 1, 1) == y, sub(substr(x, 1, 1), ""), x) 

Я знаю, что это неправильно, хотя не intuitively- sub нужен образец в качестве первого аргумента и не будет принимать substr.

попытался также:

> ifelse(substr(x, 1, 1) == y, substr(x, 1, 1) <- "", x) 
[1] "" "201" "" 

Я передал этот R: How can I replace let's say the 5th element within a string? и решить ее с помощью:

ifelse(substr(x, 1, 1) == y, paste(substr(x, 2, nchar(x))), x) 

интересно, если есть лучший способ сделать это?

ответ

5

регулярное выражение, чтобы соответствовать первый символ "^." (^ является начало строки, . любая один символ), так что используйте sub так же, как вы предлагаете:

ifelse(substr(x, 1, 1) == y, sub("^.", "", x), x) 
# [1] "01" "201" "01" 
1

Не знаю, если это лучше, но вы всегда можете использовать mapply() в такой ситуации:

x <- c("apple", "bog", "cat", "dog") 
y <- c('a', 'b', 'b', 'd') 

logi <- mapply(`==`, substr(x,1,1), y) 

substr(x[logi],1,1) <- "" 
x 
[1] "pple" "og" "cat" "og" 
0

вы можете использовать stri_sub из stringi пакета:

x = c("101", "201", "301") 
y = c("1", "7", "3") 
require(stringi) 
stri_sub(x, 1 + (stri_sub(x, 1,1)==y)) 
## [1] "01" "201" "01" 

Некоторые тесты:

require(microbenchmark) 
x <- stri_rand_strings(1000, 20, "[0-9]") 
head(x) 
## [1] "54144716481937965959" "85386002944985867089" "30205714375670945562" "81644306435633236981" 
[5] "88781777748301517606" "13505496126231808763" 
## y <- stri_rand_strings(1000, 1, "[0-9]") 
head(y) 
## [1] "1" "4" "3" "8" "4" "9" 
microbenchmark(stri_sub(x, 1 + (stri_sub(x, 1,1)==y)), ifelse(substr(x, 1, 1) == y, sub("^.", "", x), x), substr(x[mapply(`==`, substr(x,1,1), y)],1,1) <- "") 
Loading required namespace: multcomp 
Unit: microseconds 


              expr  min  lq  mean median  uq  max neval 
       stri_sub(x, 1 + (stri_sub(x, 1, 1) == y)) 154.876 160.4045 201.5347 198.4005 235.128 361.477 100 
     ifelse(substr(x, 1, 1) == y, sub("^.", "", x), x) 424.915 434.1080 493.5478 446.9575 463.251 1666.774 100 
substr(x[mapply(`==`, substr(x, 1, 1), y)], 1, 1) <- "" 4169.437 4272.4095 4590.1717 4476.1615 4673.802 7278.571 100 
+2

Хороший трюк с добавлением булево значение 'от' параметра! –

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