Как мне удалить часть строки? Например, в ATGAS_1121
я хочу удалить все до _
.
Удалить часть строки
Ответ 1
Используйте регулярные выражения. В этом случае вы можете использовать gsub
:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
Это регулярное выражение соответствует началу строки (^), любому символу (.) повторяется ноль или более раз (*) и подчеркивание (_).? делает матч "ленивым", так что он совпадает только с первым знаком подчеркивания. Это совпадение заменяется просто символом подчеркивания. Подробнее см. ?regex
Ответ 2
Вы можете использовать встроенный для этого strsplit:
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplit возвращает обе части строки, обработанные параметром split как список. Вероятно, это не то, что вы хотите, поэтому оберните вызов в список unlist, затем проиндексируйте этот массив, чтобы вернуть только второй из двух элементов в векторе.
Наконец, фиксированный параметр должен быть установлен в TRUE, чтобы указать, что параметр split не является регулярным выражением, а буквальным совпадающим символом.
Ответ 3
Здесь решение strsplit
, если s
- вектор:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Ответ 4
Если вы человек Tidyverse, вот решение stringr :
R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
Ответ 5
Здесь решение strsplit
для фрейма с использованием пакета dplyr
col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
col2 = c("T", "M", "A")
df = data.frame(col1, col2)
df
col1 col2
1 TGAS_1121 T
2 MGAS_1432 M
3 ATGAS_1121 A
df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2
col1 col2
1 1121 T
2 1432 M
3 1121 A
Ответ 6
Возможно, наиболее интуитивное решение - использовать функцию stringr str_replace
.
Единственная сложность в вашем примере - это то, что вы хотите сохранить подчеркивание, но это возможно: вы должны соответствовать регулярному выражению, пока оно не найдет указанный шаблон строки (?=pattern)
.
Смотрите пример:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"