2016-05-09 6 views
4

У меня есть data.frame в R, который для простоты имеет один столбец, который я хочу отделить. Это выглядит следующим образом:tidyr отдельно только первые n экземпляров

V1 
Value_is_the_best_one 
This_is_the_prettiest_thing_I've_ever_seen 
Here_is_the_next_example_of_what_I_want 

Мой реальные данные очень велико (миллионы строк), поэтому я хотел бы использовать отдельную функцию tidyr в (потому что это удивительно быстро), чтобы выделить только первые несколько экземпляров , Я хотел бы результат будет следующим:

V1  V2  V3  V4 
Value is  the best_one 
This  is  the prettiest_thing_I've_ever_seen 
Here  is  the next_example_of_what_I_want 

Как вы можете видеть, разделитель _ столбец V4 может иметь разное количество сепараторов. Я хочу сохранить V4 (не отбрасывать его), но не нужно беспокоиться о том, сколько там вещей. Всегда будет четыре столбца (т. Е. Ни одна из моих строк не имеет только V1-V3).

Вот моя команда Отправной tidyr Я работаю с:

separate(df, V1, c("V1", "V2", "V3", "V4"), sep="_") 

Это избавляется от В4 (и выплевывает предупреждения, что это не самая большая сделка).

+2

Do вам просто нужно 'экстра = "сливаться" '? – aosmith

+0

@ aosmith Да, спасибо. Я читал документацию как 10 раз и почему-то не понимал этого! Пожалуйста, положите его в ответ! –

ответ

11

Вам нужен аргумент extra с опцией "merge". Это позволяет использовать только столько разделов, сколько у вас есть новые столбцы.

separate(df, V1, c("V1", "V2", "V3", "V4"), extra = "merge") 

    V1 V2 V3        V4 
1 Value is the      best_one 
2 This is the prettiest_thing_I've_ever_seen 
3 Here is the next_example_of_what_I_want 
+0

Что делать, если вы хотите объединить другой путь? например, предположим, что у вас есть «John Q Public». Я хочу разбить его на две строки: «Джон Q» и «Публикация». Есть ли простой способ сделать это, кроме ручного разделения и подмножества? –

+1

@DavidBruceBorenstein Кажется, вам нужно установить аргумент 'sep', чтобы вы разделили только на последнее пространство. – aosmith

4

Вот еще один вариант с extract

library(tidyr) 
extract(df1, V1, into = paste0("V", 1:4), "([^_]+)_([^_]+)_([^_]+)_(.*)") 
#  V1 V2 V3        V4 
# 1 Value is the      best_one 
# 2 This is the prettiest_thing_I've_ever_seen 
# 3 Here is the next_example_of_what_I_want 

Другой вариант является stri_split из library(stringi) где можно указать количество расколов

library(stringi) 
do.call(rbind, stri_split(df1$V1, fixed="_", n=4)) 
Смежные вопросы