Текст в столбцы с фиксированной шириной в R - PullRequest
0 голосов
/ 03 февраля 2020

У меня большой фрейм данных, в котором я пытаюсь разделить значения из одного столбца на два. Значения являются символьными, а затем текстовыми, такими как AU2847 или AU1824. Я хочу, чтобы в первом столбце было AU, а во втором - соответствующее число 4 di git.

Я также ограничен пакетами base r, поэтому я считаю, что strsplit будет нашим лучшим выбором, но может t понять, как сделать его разделенным после 2-го символа и создать из него 2 столбца.

Ответы [ 4 ]

0 голосов
/ 04 февраля 2020

Мы можем использовать strsplit() вместе с регулярным выражением , которое использует lookbehind утверждение:

x  <- c("AU2847", "AU1824")
strsplit(x, "(?<=[A-Z]{2})", perl = TRUE)
[[1]]
[1] "AU"   "2847"

[[2]]
[1] "AU"   "1824"

Регулярное выражение lookbehind указывает strsplit() разбивать каждую строку после двух заглавных букв. Нет необходимости искусственно вводить символ для разделения, как в ответе arg0naut91 .


Теперь в ОП упоминается, что символьный вектор, подлежащий разделению, является столбцом большие данные. Для этого требуется дополнительный код для добавления вывода списка strsplit() в качестве новых столбцов к data.frame:

Предположим, у нас есть этот data.frame

DF <- data.frame(x, stringsAsFactors = FALSE)

Теперь новый К столбцам можно добавить:

DF[, c("col1", "col2")] <- do.call(rbind, strsplit(DF$x, "(?<=[A-Z]{2})", perl = TRUE))
DF
       x col1 col2
1 AU2847   AU 2847
2 AU1824   AU 1824
0 голосов
/ 03 февраля 2020

Вы можете попробовать:

as.data.frame(
  do.call(rbind,
          strsplit(sub("^(.+?)(\\d+)", "\\1_\\2", df$col),
                   split="_")
          )
  )

, где df - это имя вашего фрейма данных, а col - имя вашего столбца.

Затем искусственно вставляется подчеркивание между текстом и первым числом - таким образом, вы можете использовать подчеркивание в качестве аргумента для strsplit.

0 голосов
/ 03 февраля 2020

Есть несколько вариантов сделать это. Вы можете установить поднабор по позиции, используя substr(), или вы можете использовать gsub(), и вызов тоже будет справочным. Подстановка по позиции будет быстрее, но негибкой (вам понадобится огромный массив данных, чтобы заметить разницу во времени), и используйте регулярное выражение (gsub() будет немного медленнее, но гораздо более гибким). Например:

df[c("col2", "col3", "col2b", "col3b")] <- list(substr(df$col1, 1, 2),
                                                substr(df$col1, 3, 6),
                                                gsub("([[:alpha:]]+)(\\d+)", "\\1", df$col1),
                                                gsub("([[:alpha:]]+)(\\d+)", "\\2", df$col1))

df
    col1 col2 col3 col2b col3b
1 AU2847   AU 2847    AU  2847
2 AU1824   AU 1824    AU  1824

Данные :

df <- data.frame(col1 = c("AU2847", "AU1824"), stringsAsFactors = F)
0 голосов
/ 03 февраля 2020

Я регулярно использую эти две функции:

substrRight <- function(x, n){
  substr(x, nchar(x)-n+1, nchar(x))
}

и

substrLeft <- function(x, n){
  substr(x, 1,n)
}

, которые обрезают n символов слева или справа от строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...