Как удалить часть строки? Например, ATGAS_1121
я хочу удалить все раньше _
.
90
Используйте регулярные выражения. В этом случае можно использовать gsub
:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
Это регулярное выражение соответствует началу строки (^), любому символу (.), Повторяющемуся ноль или более раз (*), и подчеркиванию (_). ? делает совпадение "ленивым", так что только совпадения заканчиваются до первого символа подчеркивания. Это совпадение заменяется подчеркиванием. См. ?regex
Дополнительные сведения и ссылки
gsub("^.*_","_","ATGAS_1121_xxx")
. Теперь исправлено.Вы можете использовать для этого встроенный strsplit :
> s = "TGAS_1121" > s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2] > s1 [1] "1121"
strsplit возвращает обе части строки, проанализированной в параметре разделения, в виде списка . Вероятно, это не то, что вам нужно, поэтому оберните вызов в unlist , а затем проиндексируйте этот массив, чтобы возвращался только второй из двух элементов в векторе.
Наконец, для параметра fixed следует установить значение TRUE, чтобы указать, что параметр разделения не является регулярным выражением, а является буквальным совпадающим символом.
источник
Если вы человек типа Tidyverse, вот решение для стрингера :
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"
источник
Вот
strsplit
решение, еслиs
это вектор:> s <- c("TGAS_1121", "MGAS_1432") > s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2])) > s1 [1] "1121" "1432"
источник
Возможно, наиболее интуитивно понятным решением будет использование
stringr
функции,str_remove
которая даже проще, чемstr_replace
у нее только 1 аргумент вместо 2.Единственная сложность в вашем примере заключается в том, что вы хотите сохранить подчеркивание, но это возможно: вы должны сопоставлять регулярное выражение, пока оно не найдет указанный шаблон строки
(?=pattern)
.См. Пример:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") strings %>% stringr::str_remove(".+?(?=_)") [1] "_1121" "_1432" "_1121"
источник
Здесь
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
источник