Як видалити частину рядка? Наприклад, ATGAS_1121
я хочу видалити все раніше _
.
Відповіді:
Використовуйте регулярні вирази. У цьому випадку ви можете використовувати gsub
:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
Цей регулярний вираз відповідає початку рядка (^), будь-якому символу (.), Що повторюється нуль або більше разів (*), і підкресленням (_). ? робить матч «лінивим», так що він відповідає лише першим підкресленням. Цей матч замінюється лише підкресленням. Див ?regex
більш детальної інформації та посилання
Ви можете використовувати вбудований для цього, strsplit :
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplit повертає обидва фрагменти рядка, проаналізовані за параметром split, як список . Це, ймовірно , не те , що ви хочете, так обернути виклик в unlist , то індекс , що масив так , що тільки другий з двох елементів у векторі повертаються.
Нарешті, фіксованому параметру слід встановити значення TRUE, щоб вказати, що параметр split - це не регулярний вираз, а буквальний відповідний символ.
Ось 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
gsub("^.*_","_","ATGAS_1121_xxx")
. Зараз виправлено