Подмножество символов вектора по шаблону - PullRequest
0 голосов
/ 23 марта 2020

У меня есть вектор символов, состоящий из имен файлов, таких как:

vector <- c("LR1_0001_a", "LR1_0002_b", "LR02_0001_b", "LR02_0002_x", "LR3_001_c") 

Моя цель состоит в том, чтобы установить этот вектор на основе шаблона, соответствующего первому x числу символов (динамически), до первого "_ ». Результаты будут выглядеть примерно так:

solution1 <- c("LR1_0001_a", "LR1_0002_b")
solution2 <- c("LR02_0001_b", "LR02_0002_b")
solution3 <- c("LR3_001_c")

Я экспериментировал со смесью unique и grep, но пока мне не повезло

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Мы можем использовать sub, чтобы удалить все после подчеркивания "_" и split вектора.

output <- split(vector, sub('_.*', '', vector))
output

#$LR02
#[1] "LR02_0001_b" "LR02_0002_x"

#$LR1
#[1] "LR1_0001_a" "LR1_0002_b"

#$LR3
#[1] "LR3_001_c"

Возвращает список векторов, который обычно является лучшим способом управления данными вместо создания количества объектов в глобальной среде. Однако, если вы хотите использовать их как отдельные векторы, мы можем использовать list2env.

list2env(output, .GlobalEnv)

Это создаст векторы с именами LR02, LR1 и LR3 соответственно.

0 голосов
/ 23 марта 2020

Мы можем использовать trimws

out <- split(vector, trimws(vector, whitespace = "_[a-z]+"))

, а затем использовать list2env

list2env(out, .GlobalEnv)
0 голосов
/ 23 марта 2020

Решение Base R (приведение вектора к data.frame):

# Split vector into list (as in ronak's answer): 

vect_list <- split(vect, sub("_.*", "", vect)) 

# Pad each vector in the list to be the same length as the longest vector: 

padded_vect_list <- lapply(vect_list, 
                           function(x){length(x) = max(lengths(vect_list)); return(x)})

# Coerce the list of vectors into a dataframe: 

df <- data.frame(do.call("cbind", padded_vect_list))

Данные:

vect <- c("LR1_0001_a", "LR1_0002_b", "LR02_0001_b", "LR02_0002_x", "LR3_001_c") 
...