R Отдельно по местоположению? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть столбец (char) во фрейме данных. Столбец состоит из данных, отформатированных таким образом:

df <- c("Apr 19 DBH", "Apr 19 PPA", "Apr 19 MI", "Apr 19 Total") 

Я хочу отделить 19 апреля от следующих символов, создав 2 столбца:

Date       Prod
-----------------
Apr 19     DBH
Apr 19     PPA
Apr 19     MI
Apr 19     Total 

Я могу substr(df, 1, 7) в столбец, но затем все равно нужно разделять символы после позиции 7.

Я думал, что separate было бы хорошим решением, но sep =, похоже, требует строку некоторого типа. У меня есть только пробелы, и в этом случае у меня есть 2 пробела. Я, возможно, мог бы вставить символ в строку и отдельный на этом, но чувствует себя неуклюжим. Вы можете разделить только первой позицией персонажа? Или есть лучший способ?

Ответы [ 3 ]

1 голос
/ 27 марта 2020

Мы можем использовать extract:

tidyr::extract(df, col, into = c('Date', 'Prod'), regex = "(.*)\\s+(\\w+)")

#    Date  Prod
#1 Apr 19   DBH
#2 Apr 19   PPA
#3 Apr 19    MI
#4 Apr 19 Total

Это делит данные на две части, 1-е, захватывает все до последнего пробела и 2-е последнее слово в столбце.

данные

df <- data.frame(col = df)
0 голосов
/ 27 марта 2020

1) read.table Вставьте точку с запятой после последнего пробела и прочитайте ее, используя точку с запятой в качестве разделителя полей. Пакеты не используются.

s <- sub("(.* )", "\\1;", df)
read.table(text = s, sep = ";", as.is = TRUE, strip.white = TRUE)

Если мы знали, что в первом поле не более одного пробела и как минимум два отделяют его от второго поля, тогда первую строку можно упростить до:

s <- sub("  ", ";", df)

2) read.fwf Другое базовое решение R - использовать read.fwf для чтения полей фиксированной ширины.

n <- max(nchar(df))
read.fwf(textConnection(df), c(7, n-7), strip.white = TRUE, as.is = TRUE)
0 голосов
/ 27 марта 2020

Вы можете использовать функцию str_split из пакета stringr.

Обратите внимание, что регулярное выражение " {2,}" указывает функции делиться на 2 или более пробелов.

library(stringr)
str_split(df, pattern = " {2,}", simplify = TRUE)
     [,1]     [,2]    
[1,] "Date"   "Prod"  
[2,] "Apr 19" "DBH"   
[3,] "Apr 19" "PPA"   
[4,] "Apr 19" "MI"    
[5,] "Apr 19" "Total"

Данные

df <- c("Date       Prod", "Apr 19     DBH", "Apr 19     PPA", "Apr 19     MI", 
"Apr 19     Total ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...