Я хотел бы взять данные формы
before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
attr type
1 1 foo_and_bar
2 30 foo_and_bar_2
3 4 foo_and_bar
4 6 foo_and_bar_2
и используйте split()
столбец " type
" сверху, чтобы получить что-то вроде этого:
attr type_1 type_2
1 1 foo bar
2 30 foo bar_2
3 4 foo bar
4 6 foo bar_2
Я придумал что-то невероятно сложное, включающее какую-то форму, apply
которая сработала, но с тех пор я это неуместно. Это казалось слишком сложным, чтобы быть лучшим способом. Я могу использовать, strsplit
как показано ниже, но тогда неясно, как вернуть это обратно в 2 столбца во фрейме данных.
> strsplit(as.character(before$type),'_and_')
[[1]]
[1] "foo" "bar"
[[2]]
[1] "foo" "bar_2"
[[3]]
[1] "foo" "bar"
[[4]]
[1] "foo" "bar_2"
Спасибо за любые указатели. Я еще не совсем прогнал R списки.
left_right <- str_split_fixed(as.character(split_df),'\">',2)
str_split_fixed("aaa...bbb", fixed("..."), 2)
прекрасно работает сfixed()
«Сопоставить фиксированную строку» вpattern=
аргументе..
означает «любой символ» в регулярном выражении.Другой вариант - использовать новый пакет tidyr.
источник
str_split_fixed
добавлением столбцов в существующий фрейм данных)?5 лет спустя добавление обязательного
data.table
решенияМы могли бы также убедиться, что получающиеся столбцы будут иметь правильные типы и улучшить производительность, добавляя
type.convert
иfixed
аргументы (так"_and_"
как на самом деле это не регулярное выражение)источник
'_and_'
шаблонов варьируется, вы можете узнать максимальное количество совпадений (то есть будущие столбцы) сmax(lengths(strsplit(before$type, '_and_')))
strsplit
его, он создает один вектор с 2 значениями в каждом слоте, поэтомуtstrsplit
транспонирует его в 2 вектора с одним значением в каждом.paste0
используется только для создания имен столбцов, он не используется для значений. На LHS уравнения указаны имена столбцов, на RHS - операция разделения + транспонирования столбца.:=
расшифровывается как « назначить на место », поэтому вы не видите там<-
оператора присваивания.Еще один подход: использовать
rbind
наout
:И объединить:
источник
strcapture("(.*)_and_(.*)", as.character(before$type), data.frame(type_1 = "", type_2 = ""))
Обратите внимание, что sapply с «[» можно использовать для извлечения первого или второго элементов в этих списках так:
А вот метод gsub:
источник
Вот один вкладыш в том же ключе, что и в решении Aniko, но с использованием пакета stringl hadley:
источник
stringr
пакетом.Чтобы добавить к опциям, вы также можете использовать мою
splitstackshape::cSplit
функцию следующим образом:источник
Простым способом является использование
sapply()
и[
функции:Например:
sapply()
В результате получается матрица, которая нуждается в переносе и приведении к кадру данных. Затем некоторые простые манипуляции дают желаемый результат:На данный момент,
after
это то , что вы хотелиисточник
Тема почти исчерпана, я хотел бы предложить решение немного более общей версии, в которой вы не знаете количество выходных столбцов априори. Так, например, у вас есть
Мы не можем использовать dplyr,
separate()
потому что мы не знаем число столбцов результата до разделения, поэтому я создал функцию, которая используетstringr
для разделения столбца, учитывая шаблон и префикс имени для сгенерированных столбцов. Я надеюсь, что используемые шаблоны кодирования верны.Затем мы можем использовать
split_into_multiple
в трубе dplyr следующее:И тогда мы можем использовать,
gather
чтобы привести в порядок ...источник
Вот базовая строка R one, которая перекрывает несколько предыдущих решений, но возвращает data.frame с собственными именами.
Он использует,
strsplit
чтобы разбить переменную иdata.frame
с помощьюdo.call
/rbind
поместить данные обратно в data.frame. Дополнительным постепенным улучшением является использованиеsetNames
для добавления имен переменных в data.frame.источник
Этот вопрос довольно старый, но я добавлю решение, которое мне показалось самым простым в настоящее время.
источник
Начиная с версии 3.4.0 R, которую вы можете использовать
strcapture()
из пакета utils (входит в базовую установку R), связывает вывод с другими столбцами.источник
Другой подход, если вы хотите придерживаться,
strsplit()
это использоватьunlist()
команду. Вот решение в том же духе.источник
базовый, но, вероятно, медленный:
источник
Вот еще одно базовое решение R. Мы можем использовать,
read.table
но так как он принимает только однобайтовыйsep
аргумент, и здесь у нас есть многобайтовый разделитель, который мы можем использоватьgsub
для замены многобайтового разделителя на любой однобайтовый разделитель и использовать его в качествеsep
аргумента вread.table
В этом случае мы также можем сделать его короче, заменив его
sep
аргументом по умолчанию, поэтому нам не нужно явно упоминать егоисточник