Привет! Я хотел бы разбить один столбец data.frame на несколько столбцов, но с последовательными разделителями, которые рассматриваются как один. Мои входные данные были скопированы из текстового файла, так что это немного путаница с различными разделителями, а иногда один и тот же дублируется несколько раз. В моем примере ниже я использую пробел, запятую, "и" или тире в качестве разделителей, но на самом деле у меня> 6 разных, включая несколько слов ("и" и "вкл").
Я бы обычно использовал tidyr::separate
, но у него нет возможности комбинировать последовательные разделители. Попытка составить исчерпывающий список возможных комбинаций для шаблона вскоре становится нелепой, тем более что иногда у меня может быть 4 или 5 пробелов или запятых подряд.
Я предоставил репрезентативный и желаемый вывод (сделанный путем ручного изменения текста, что невозможно в моих реальных данных о тысячах строк) ниже
Данные:
library(tidyr)
testdf <- data.frame(test = c("This string has single spaces",
"This one has double spaces",
"This, has, comma,or space, or ,both",
"This,one-, space,- comma -,and-dash"))
Вот коды, которые я пытался использовать до сих пор:
separate(testdf, test, into = letters[1:12], sep = " |,|-|and", fill = "right")
#> Warning: Expected 12 pieces. Additional pieces discarded in 2 rows [3, 4].
#> a b c d e f g h i j k l
#> 1 This string has single spaces <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 This one has double spaces <NA> <NA> <NA>
#> 3 This has comma or space
#> 4 This one space comma
#sort of starting to work but gets very extensive very fast
separate(testdf, test, into = letters[1:12], sep = " |, |, | |and|,", fill = "right")
#> a b c d e f g h i j k l
#> 1 This string has single spaces <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 This one has double spaces <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 3 This has comma or space or both
#> 4 This one- space - comma - -dash <NA> <NA>
На основании ответа Грегора, прежде чем я указал, мне нужны разделители слов:
separate(testdf, test, into = letters[1:12], sep = "[ ,-]+", fill = "right")
#> a b c d e f g h i j k l
#> 1 This string has single spaces <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 2 This one has double spaces <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 3 This has andcomma or and space or both <NA> <NA> <NA> <NA>
#> 4 This one space and comma and dash <NA> <NA> <NA> <NA> <NA>
###*Desired Output:*
```r
#> a b c d e f g
#> 1 This string has single spaces <NA> <NA>
#> 2 This one has double spaces <NA> <NA>
#> 3 This has comma or space or both
#> 4 This one space comma dash <NA> <NA>
Создано в 2019-10-30 представьте пакет (v0.3.0)