Как отделить столбец в R с неравной длиной символов и без разделителей - PullRequest
1 голос
/ 13 февраля 2020

Я хочу разделить столбец, содержащий даты и элементы, на два столбца.

V1
23/2/2000shampoo
24/2/2000flour
21/10/2000poultry
17/4/2001laundry detergent

На это

V1           V2
23/2/2000    shampoo
24/2/2000    flour
21/10/2000   poultry
17/4/2001    laundry detergent

Моя проблема в том, что между ними нет разделения. Длина даты не является одинаковой (она имеет формат 01.01.2000 вместо 01.01.2000), поэтому я не могу разделить по длине символа. Набор данных также охватывает несколько лет.

Ответы [ 3 ]

4 голосов
/ 13 февраля 2020

Один вариант будет separate из tidyr. Мы указываем sep с регулярным выражением для разделения между di git и строчной буквой

library(dplyr)
library(tidyr)
df1 %>%
   separate(V1, into = c("V1", "V2"), sep="(?<=[0-9])(?=[a-z])")
#        V1                V2
#1  23/2/2000           shampoo
#2  24/2/2000             flour
#3 21/10/2000           poultry
#4  17/4/2001 laundry detergent

Или с read.csv после создания разделителя с sub

read.csv(text = sub("(\\d)([a-z])", "\\1,\\2", df1$V1), 
         header = FALSE, stringsAsFactors = FALSE)

данные

df1 <- structure(list(V1 = c("23/2/2000shampoo", "24/2/2000flour", 
      "21/10/2000poultry", 
"17/4/2001laundry detergent")), class = "data.frame", row.names = c(NA, 
-4L))
2 голосов
/ 13 февраля 2020

Вы также можете использовать группы захвата с tidyr::extract(). Первая группа \\d{1,2}/\\d{1,2}/\\d{4} получает дату в формате, который вы опубликовали, а вторая группа [[:print:]]+ получает как минимум один печатный символ.

library(tidyverse)

df1 %>%
  extract(V1, c("V1", "V2"), "(\\d{1,2}/\\d{1,2}/\\d{4})([[:print:]]+)")
          V1                V2
1  23/2/2000           shampoo
2  24/2/2000             flour
3 21/10/2000           poultry
4  17/4/2001 laundry detergent

Данные :

df1 <- readr::read_csv("V1
23/2/2000shampoo
24/2/2000flour
21/10/2000poultry
17/4/2001laundry detergent")
1 голос
/ 13 февраля 2020

Вы также можете использовать:

data <- data.frame(V1 = c("23-02-2000shampoo", "24-02-2001flour"))

library(stringr)
str_split_fixed(data$V1, "(?<=[0-9])(?=[a-z])", 2)

     [,1]         [,2]     
[1,] "23-02-2000" "shampoo"
[2,] "24-02-2001" "flour"  
...