Использование substr () для удаления символа - PullRequest
0 голосов
/ 03 мая 2018

У меня есть персонаж "abc" и я хочу удалить "b". Я хочу, чтобы цель по позиции. Я попробовал:

x <- "abc"
substr(x, 2,3) <- ""

x
#[1] "abc"

Почему невозможно удалить символ из строки, подобной этой? Как бы я сделал это так же просто?

Ответы [ 5 ]

0 голосов
/ 03 мая 2018

Кажется, пустая строка не поддерживается.

Самый простой способ взломать это использовать символ, который не может быть в ваших данных, тогда gsub out:

x <- "abc"
substr(x, 2,3) <- "\a"
x <- gsub("\a","",x)
x
# [1] "ac"

Вы, конечно, можете использовать gsub напрямую, как предлагалось другим, но я предположил, что замена на индекс была важной функцией.

\a - символ колокола из Википедии:

Код звонка (иногда символ звонка) - это код управления устройством. Первоначально послал позвонить небольшой электромеханический колокол на тикерах и другие телепринтеры и телетайперы, чтобы предупредить операторов на другом конец строки, часто входящего сообщения

Так что вы, вероятно, в безопасности!

0 голосов
/ 03 мая 2018

Вы сказали, что «хотите нацелиться на позицию» , если вы имеете в виду, что хотите извлечь второй символ из вашей строки независимо от его значения, тогда вы можете просто сделать:

x <- paste0(substr(x, 1, 1), substr(x, 3, nchar(x)))
# "ac" if x <- "abc" initially and "acd" if x <- "abcd" initially

Вы можете заменить символ на substr(), но не удалить его (поскольку вам необходимо изменить положение всех следующих символов и т. Д.). Чтобы достичь этого, вы можете комбинировать substr и gsub следующим образом (например, если вы уверены, что ваша строка не содержит тире):

substr(x, 2, 3) <- '-'
gsub('-', '', x)

Если вы хотите удалить "b" вхождения, тогда gsub(), как объяснено в ответах выше, является хорошим вариантом.

0 голосов
/ 03 мая 2018

вы должны использовать функцию gsub (): gsub(pattern = "b",replacement = "",x = x)

0 голосов
/ 03 мая 2018

Вы всегда можете использовать strsplit, что полезно. Если вы хотите решить эту проблему по позиции (т.е. в вашем случае удалите 2-ю букву),

paste(strsplit(x, '')[[1]][-2], collapse = '')
#[1] "ac"

Чтобы применить к нескольким строкам, нам нужно выполнить итерацию после разбиения, т.е.

x <- c('abc', 'sdfre', 'xyz')
sapply(strsplit(x, ''), function(i)paste(i[-2], collapse = ''))
#[1] "ac"   "sfre" "xz"  
0 голосов
/ 03 мая 2018

Тривиально, вы можете просто использовать sub/gsub здесь:

gsub("b", "", x)

Но это удалит все b буквы, независимо от того, где они появляются. Если вы хотите нацелиться на b, зажатый между a и c, вы можете стать умнее и использовать обходные пути:

gsub("(?<=a)b(?=c)", "", x, perl=TRUE)

Изменить:

Как отметил @DavidKlotz в своем комментарии ниже, если вы действительно хотите удалить второй символ, вы можете использовать:

gsub("(?<=^.).","", x, perl=TRUE)
...