В R, как мне разбить каждую строку в векторе, чтобы вернуть все до N-го экземпляра символа? - PullRequest
3 голосов
/ 03 марта 2020

Пример:

 df <- data.frame(Name = c("J*120_234_458_28", "Z*23_205_a834_306", "H*_39_004_204_99_04902"))

Я хотел бы иметь возможность выбрать все перед третьим подчеркиванием для каждой строки в кадре данных. Я понимаю, как разделить строку на части:

df$New <- sapply(strsplit((df$Name),"_"), `[`)

Но это помещает список в каждую строку. До сих пор я не мог понять, как использовать sapply для unlist () каждой строки df $ New, выбрать первые N элементов списка, чтобы вставить / свернуть их вместе. Поскольку длина каждого подэлемента может быть разной, а количество подэлементов также может быть разным, я не смог найти альтернативный способ получения этой информации.

1 Ответ

2 голосов
/ 03 марта 2020

Мы указываем 'n', после разделения столбца character на '_', извлекаем n-1 первые компоненты

 n <- 4
 lapply(strsplit(as.character(df$Name), "_"), `[`, seq_len(n - 1))

Если нам нужно paste, то вместе, можно использовать вызов анонимной функции (function(x)) после зацикливания list с lapply/sapply, получение первых n элементов с head и paste их вместе`

sapply(strsplit(as.character(df$Name), "_"), function(x) 
          paste(head(x, n - 1), collapse="_"))
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"   

Или используйте метод регулярных выражений

sub("^([^_]+_[^_]+_[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004" 

Или, если 'n' действительно большое, то

pat <- sprintf("^([^_]+){%d}[^_]+).*", n-1)
sub(pat, "\\1", df$Name) 

или

sub("^(([^_]+_){2}[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...