2016-11-05 7 views
0

Эй так что я Тиббл с головой() распечатанный так:Как отделить данные с помощью 5 разделителей вопросительных знаков с помощью отдельных()?

# A tibble: 6 × 1 
            id.make.model.year 
              <chr> 
1 27550?????AM General?????DJ Po Vehicle 2WD?????1984 
2 28426?????AM General?????DJ Po Vehicle 2WD?????1984 
3 27549?????AM General?????FJ8c Post Office?????1984 
4 28425?????AM General?????FJ8c Post Office?????1984 
5 1032?????AM General?????Post Office DJ5 2WD?????1985 
6 1033?????AM General?????Post Office DJ8 2WD?????1985 

только с одной колонкой. Я хочу разделить это на четыре столбца с этими четырьмя именами столбцов. Я пытался использовать separate()

A %>% 
    separate(id.make.model.year,into=c("id","make"),sep="?????") 

и

A %>% 
    separate(id.make.model.year,into=c("id","make"),sep="\\?????") 

, но они оба возвращают следующее сообщение об ошибке:

Error in stringi::stri_split_regex(value, sep, n_max) : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)

Еще один попробовать ...:

A %>% 
    separate(id.make.model.year,into=c("id","make"),sep="[?????]") 

который возвращает

# A tibble: 33,439 × 2 
     id make 
* <chr> <chr> 
1 27550  
2 28426  
3 27549  
4 28425  
5 1032  
6 1033  
7 3347  
8 13309  
9 13310  
10 13311  
# ... with 33,429 more rows 
Warning message: 
Too many values at 33439 locations: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ... 

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

Каков правильный способ сделать это? Заранее спасибо.

+0

Пожалуйста, добавьте вывод 'dput (head (df))' в свой вопрос, чтобы сделать это [воспроизводимым примером] (https://stackoverflow.com/questions/5963269/how-to-make-a- большой-р-воспроизводимый-пример). Во всяком случае, это просто звучит как простой вопрос с регулярным выражением. – smci

+0

Регулярное выражение соответствует одному знаку вопроса ''? 'Или' [?] '. Однако, если у вас их пять, '[?????]' все еще один соответствует одному вхождению этого символа, так же как '[aaaaa]' будет соответствовать только одной букве 'a', а не пяти. Поэтому я думаю, что вы хотите '\? {5}' или '[?] {5}' (или '\? \? \? \? \?' Или '[?] [?] [?] [?] [ ?] '). Пока вы не отправляете данные с помощью 'dput()' я не могу подтвердить. – smci

+0

Кстати, если '?????' пришел из 'read.csv()' с неправильной кодировкой Unicode или странным символом разделителя, вы можете исправить это. – smci

ответ

2

Регулярное выражение, чтобы соответствовать один знак вопроса \? или [?]. Однако, если у вас есть пять из них, [?????] все еще только один соответствует одному вхождению этого символа, потому что [...] определяет класс символов. Точно так же, как [aaaaa] будет соответствовать только одной букве a, а не пяти.

Так, чтобы захватить пять повторений, я думаю, вы хотите \?{5} или [?]{5} (или \?\?\?\?\? или [?][?][?][?][?]).

Пока вы не публикуете данные с dput() Не могу подтвердить.

+1

большое спасибо, используя то, что вы предложили ему сработало! – godric97

1

Это одно из решений для вас с пакетами splitstackshape и data.table. Вы разделили столбец на cSplit(). Поскольку вы хотите четыре столбца, вы хотите указать direction = "wide" в функции. Создав четыре столбца, вы хотите изменить имена столбцов. Я разделил имя исходного столбца с помощью strsplit() и создал четыре имени, которые вы хотите.

library(splitstackshape) 
library(data.table) 

mydf <- data.frame(id.make.model.year = c("27550?????AM General?????DJ Po Vehicle 2WD?????1984", 
              "28426?????AM General?????DJ Po Vehicle 2WD?????1984"), 
        stringsAsFactors = F) 

temp <- cSplit(mydf, splitCols = "id.make.model.year", sep = "?????", direction = "wide") 
setnames(temp, unlist(strsplit(names(mydf), "[.]"))) 


#  id  make    model year 
#1: 27550 AM General DJ Po Vehicle 2WD 1984 
#2: 28426 AM General DJ Po Vehicle 2WD 1984 
+0

большое спасибо! также хорошее средство для этого – godric97