Как разделить строку с помощью tidyr::separate в R и сохранить значения строки-разделителя?

У меня есть набор данных:

crimes<-data.frame(x=c("Smith", "Jones"), charges=c("murder, first degree-G, manslaughter-NG", "assault-NG, larceny, second degree-G"))

Я использую tidyr:separate, чтобы разделить столбец сборов на совпадение с "G",

crimes<-separate(crimes, charges, into=c("v1","v2"), sep="G,")

Это разбивает мои столбцы, но удаляет разделитель «G». Я хочу сохранить букву «G» в результирующем разделении столбца.

Мой желаемый результат:

 x         v1                       v2
 Smith     murder, first degree-G   manslaughter-NG
 Jones     assault-NG               larceny, second degree-G

Любые предложения приветствуются.


person TDog    schedule 13.04.2016    source источник
comment
Каков ваш желаемый результат?   -  person Tim Biegeleisen    schedule 13.04.2016
comment
Глядя на данные, кажется, что sep = ', ' был бы практичным выбором.   -  person alistaire    schedule 13.04.2016
comment
Да, это сработает, но в моих реальных данных в строке смешаны запятые. Таким образом, «G» — единственный практичный разделитель. Но я не могу понять, как сохранить букву «G» при использовании ее как части строки разделителя.   -  person TDog    schedule 13.04.2016
comment
Я скорректировал пример данных в исходном вопросе, чтобы было более понятно, почему мне нужно разделить с помощью «G,»   -  person TDog    schedule 13.04.2016


Ответы (2)


ОБНОВЛЕНИЕ

Это то, о чем вы просите. Имейте в виду, что ваши данные не аккуратны (и V1, и V2 имеют более одной переменной внутри каждого столбца).

A<-separate(crimes,charges,into=c("V1","V2"),sep = "(?<=G,)")
A
      x                      V1                        V2
1 Smith murder, first degree-G,           manslaughter-NG
2 Jones             assault-NG,  larceny, second degree-G

Более простой способ сохранить «G» или «NG» - использовать sep=", ", как сказал Алистер.

A<-separate(crimes, charges, into=c("v1","v2"), sep = ', ')

Это дает

      x         v1              v2
1 Smith   murder-G manslaughter-NG
2 Jones assault-NG       larceny-G

Если вы хотите продолжать разделять свой data.frame (используя -)

separate(A, v1, into = c("v3","v4"), sep = "-")

что дает

      x      v3 v4              v2
1 Smith  murder  G manslaughter-NG
2 Jones assault NG       larceny-G

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

person Matias Andina    schedule 13.04.2016
comment
Извините, мой пример не включал реальный случай моих данных, в котором запятые смешаны с обвинениями. Таким образом, G необходим в качестве строки экстрактора, чтобы отличать от существующих. - person TDog; 13.04.2016
comment
И мой желаемый результат: x v1 v2 1 Убийство Смита-G непредумышленное убийство-NG - person TDog; 13.04.2016
comment
Огромный реквизит @Matias Andina. Это отлично сработало. Теперь о дальнейшей чистке. Как вы заметили, мои данные не аккуратны. Во всяком случае, еще нет. - person TDog; 13.04.2016

Замените <yourRegexPattern> своим регулярным выражением

Если вы хотите, чтобы в левом столбце отображалось слово "sep" (посмотрите назад)

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?<=<yourRegexPattern>)")

Если вы хотите, чтобы в правом столбце отображался 'sep' (загляните вперед)

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=<yourRegexPattern>)")

Также обратите внимание, что когда вы пытаетесь отделить слово от группы цифр (т. е. от Auguest1990 до August и 1990), вам нужно будет убедиться, что весь шаблон прочитан.

Пример:

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=[[:digit:]])", extra="merge")
person Cameron    schedule 19.07.2018