2015-02-23 2 views
0

У меня есть векторы символов, как этотманипулируют строки R для получения конкретных результатов

sol=c("119","911","*","ab","ba","*","*","abcd","bcda","abcd","cdab","abcd","dabc","*","*","*","*") 

Я хочу взять вектор в то время, и производить вывод, как показано ниже.

Каков самый быстрый способ сделать то же самое? В принципе, я хочу начать новую строку там, где есть *. Если есть последовательные *, то я хочу только одну новую строку. Последовательные не являющиеся * элементы должны быть напечатаны на новую строку и в случае последовательных, не являющихся * элементов, если есть повторяющаяся элемент, то он не должен получить печатную

119 911 
ab ba 
abcd bcda cdab dabc 

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

ответ

2

Вот попытка, основанная на cumsum -ную случаи, которые соответствуют *:

lapply(split(sol[sol!="*"],cumsum(sol=="*")[sol!="*"]),unique) 
#$`0` 
#[1] "119" "911" 
# 
#$`1` 
#[1] "ab" "ba" 
# 
#$`3` 
#[1] "abcd" "bcda" "cdab" "dabc" 

Вы могли бы написать это в текстовый файл с помощью: R: Print list to a text file

+0

спасибо. Я добавил строку - writeLines (unlist (lapply (mylist, paste, collapse = ""))) , предоставленный в ссылке, которую вы дали, и я получаю то, что я ищу – user2543622

+0

, можно ли объяснить, как работает линия выше ? Я понимаю лап и разделенную часть. Я смущен насчет 'cumsum (sol ==" * ") [sol! =" * "]' Part. Я знаю, что '(sol ==" * ")' возвращает true, ложный список, основанный на настоящем символа * в sol, 'sol! =" * "]' Делает точную противоположность и cumsum является суммарной суммой fuction. Но я путаюсь с тем, как эти вещи работают, когда они вместе. Каков порядок, в котором каждый из них решается? – user2543622

+0

@ user2543622 - когда вы cumsum векторное соответствие * вы получаете счетчик, который увеличивается на 1 каждый раз *. Это означает, что в каждой группе non * у вас есть другое значение постоянного счетчика. Поскольку split работает на векторе, который удаляет значения *, этот же выбор должен произойти и для фактической групповой переменной. Отсюда и подмножество кумулятивной части. Попробуйте разбить код и запустить каждый раздел, чтобы увидеть, как он работает. – thelatemail

1

Вы можете попробовать ниже,

> print(gsub("(?:\\s*\\*)+\\s*", "\\\n", paste(sol, collapse=" "))) 
[1] "119 911\nab ba\nabcd bcda abcd cdab abcd dabc\n" 
+0

близко. Но как я могу получить новую строку вместо \ n? Как показано в моем выпуске в вопросе, я хочу, чтобы каждый набор текста на новой строке. Также как я мог избавиться от второго и третьего abcd от «abcd bcda abcd cdab abcd dabc»? – user2543622

+1

@ user2543622 - '\ n' - новая строка. – thelatemail

Смежные вопросы