Разделение столбца строки dataframe на несколько разных столбцов

Я пытаюсь выполнить разбиение столбца на несколько столбцов. Я бы предпочел, чтобы первый столбец содержал «F», второй столбец «US», третий «CA6» или «DL», а четвертый – «Z13» или «U13» и т. Д. И т. Д. Весь мой df следует той же схеме X.XX.XXXX.XXX или X.XX.XXX.XXX или X.XX.XX.XXX, и я знаю, что третий столбец – это моя проблема из-за разных длин. Я использовал только substr в прошлом, и я мог бы использовать это здесь с некоторыми операциями if, но хотел бы узнать, как использовать пакет stringr и POSIX для этого (если только не существует лучшего варианта). Заранее спасибо.

Вот мой df:

c("F.US.CLE.V13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.DL.U13", "F.US.DL.U13", "F.US.DL.U13", "F.US.DL.Z13", "F.US.DL.Z13" ) 

Очень прямой способ – просто использовать read.table для вашего символьного вектора:

 > read.table(text = text, sep = ".", colClasses = "character") V1 V2 V3 V4 1 F US CLE V13 2 F US CA6 U13 3 F US CA6 U13 4 F US CA6 U13 5 F US CA6 U13 6 F US CA6 U13 7 F US CA6 U13 8 F US CA6 U13 9 F US DL U13 10 F US DL U13 11 F US DL U13 12 F US DL Z13 13 F US DL Z13 

colClasses необходимо указать, иначе F будет преобразован в FALSE (что мне нужно исправить в «splitstackshape», иначе я бы рекомендовал это :))


Обновление (> через год) …

Кроме того, вы можете использовать мою функцию cSplit , например:

 cSplit(as.data.table(text), "text", ".") # text_1 text_2 text_3 text_4 # 1: F US CLE V13 # 2: F US CA6 U13 # 3: F US CA6 U13 # 4: F US CA6 U13 # 5: F US CA6 U13 # 6: F US CA6 U13 # 7: F US CA6 U13 # 8: F US CA6 U13 # 9: F US DL U13 # 10: F US DL U13 # 11: F US DL U13 # 12: F US DL Z13 # 13: F US DL Z13 

Или, separate от «тидыр», вот так:

 library(dplyr) library(tidyr) as.data.frame(text) %>% separate(text, into = paste("V", 1:4, sep = "_")) # V_1 V_2 V_3 V_4 # 1 F US CLE V13 # 2 F US CA6 U13 # 3 F US CA6 U13 # 4 F US CA6 U13 # 5 F US CA6 U13 # 6 F US CA6 U13 # 7 F US CA6 U13 # 8 F US CA6 U13 # 9 F US DL U13 # 10 F US DL U13 # 11 F US DL U13 # 12 F US DL Z13 # 13 F US DL Z13 

Это то, что вы пытаетесь сделать?

 # Our data text <- c("F.US.CLE.V13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.CA6.U13", "F.US.DL.U13", "F.US.DL.U13", "F.US.DL.U13", "F.US.DL.Z13", "F.US.DL.Z13" ) # Split into individual elements by the '.' character # Remember to escape it, because '.' by itself matches any single character elems <- unlist( strsplit( text , "\\." ) ) # We know the dataframe should have 4 columns, so make a matrix m <- matrix( elems , ncol = 4 , byrow = TRUE ) # Coerce to data.frame - head() is just to illustrate the top portion head( as.data.frame( m ) ) # V1 V2 V3 V4 #1 F US CLE V13 #2 F US CA6 U13 #3 F US CA6 U13 #4 F US CA6 U13 #5 F US CA6 U13 #6 F US CA6 U13 

Путь через unlist и matrix выглядит немного запутанным и требует жесткого кодирования количества элементов (на самом деле это довольно большой вариант «нет». Конечно, вы можете обойти жесткое кодирование этого номера и определить его во время выполнения )

Я бы пошел другим путем и построил кадр данных непосредственно из списка, который возвращает strsplit . Для меня это концептуально проще. Есть два способа сделать это:

  1. as.data.frame – но поскольку список точно не соответствует пути (у нас есть список строк, а не список столбцов), мы должны перенести результат. Мы также rownames поскольку они по умолчанию уродливы (но это абсолютно бесполезно!):

     `rownames<-`(t(as.data.frame(strsplit(text, '\\.'))), NULL) 
  2. В качестве альтернативы, используйте rbind для создания фрейма данных из списка строк. Мы используем do.call для вызова rbind со всеми строками в виде отдельных аргументов:

     do.call(rbind, strsplit(text, '\\.')) 

Оба способа дают тот же результат:

  [,1] [,2] [,3] [,4] [1,] "F" "US" "CLE" "V13" [2,] "F" "US" "CA6" "U13" [3,] "F" "US" "CA6" "U13" [4,] "F" "US" "CA6" "U13" [5,] "F" "US" "CA6" "U13" [6,] "F" "US" "CA6" "U13" … 

Ясно, что второй способ намного проще первого.

  • У XSLT есть функция Split ()?
  • Разделение на запятую вне цитат
  • Разделение csv-файла с кавычками как разделитель текста с помощью String.split ()
  • Как эффективно анализировать CSV-файл в Perl?
  • Как strtok () разбивает строку на токены в C?
  • Как разбить фрейм данных?
  • Разделить строку строки фрейма данных на несколько столбцов
  • Регулярное выражение для разделения строки с использованием пробела, если оно не окружено одинарными или двойными кавычками
  • Разделение строки на каждый n-й символ
  • Разделение Java ест моих персонажей
  • Java: как разбить строку на несколько символов?
  • Interesting Posts

    Текстовое поле скрыто под клавиатурой в веб-браузере Android

    Что мне делать: для этого требуется android.permission.INTERACT_ACROSS_USERS_FULL

    Что означает :: (двойной двоеточие) в пакетных файлах DOS?

    как блокировать или ограничивать специальные символы из полей ввода с помощью jquery?

    Как обменяться между различными .c файлами?

    Компьютер Windows 7 висит в течение нескольких секунд очень часто; Свет ввода-вывода диска остается на замерзании

    Соединение RMI отказалось на localhost

    Создание ошибки образа системы Windows 8.1

    Как объединить два раза с препроцессором C и развернуть макрос, как в «arg ## _ ## MACRO»?

    Конфигурация RAID «просматривается» через

    Не удалось зарегистрироваться на сервере загрузки

    Netstat с именем процесса?

    Открыть закладки на новой вкладке

    Взятие «скриншотов» определенного макета в Android

    Как я могу работать с динамически распределенными произвольномерными массивами?

    Давайте будем гением компьютера.