разделить вектор строк с частичным совпадением - PullRequest
1 голос
/ 30 марта 2020

Если у меня есть список некоторых элементов:

x = c('abc', 'bbc', 'cd', 'hj', 'aa', 'zz', 'd9', 'jk')

Я бы хотел разделить его каждый раз, когда есть 'a' для создания вложенного списка:

[1][[1]] 'abc', 'bbc', 'cd', 'hj'
[2][[1]] 'aa', 'zz', 'd9', 'jk'

Я пробовал

split(x, 'a') 

, но split не ищет частичных совпадений.

Ответы [ 3 ]

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

Другое базовое решение R с использованием split + findInterval (код не такой короткий, как ответ @ akrun )

split(x,findInterval(seq_along(x),grep("a",x)))

, такой что

> split(x,findInterval(seq_along(x),grep("a",x)))
$`1`
[1] "abc" "bbc" "cd"  "hj" 

$`2`
[1] "aa" "zz" "d9" "jk"
2 голосов
/ 30 марта 2020

Другая base R возможность может быть:

split(x, cumsum(nchar(sub("a", "", x, fixed = TRUE)) - nchar(x) != 0))

$`1`
[1] "abc" "bbc" "cd"  "hj" 

$`2`
[1] "aa" "zz" "d9" "jk"
2 голосов
/ 30 марта 2020

Мы можем создать группу, сопоставив подстроку 'a' с grepl логическому вектору, а затем преобразовать в число c, получив кумулятивную сумму для отдельных групп, и использовать ее в split

split(x, cumsum(grepl('a', x)))
#$`1`
#[1] "abc" "bbc" "cd"  "hj" 

#$`2`
#[1] "aa" "zz" "d9" "jk"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...