Как разделить строки символов в таблице в новые столбцы, если строки принадлежат разным классам? - PullRequest
0 голосов
/ 23 января 2020

У меня есть столбец в таблице с записями в форме 2XYZ005GHT108, и я хочу разделить их на 4 новых столбца: «2XYZ», «005», «GHT» и «108». Мои записи не включают разделители. Я не знаю, что вводить в качестве аргумента sep = в функции Отдельные () в Tidyr.

library(tidyverse)
library(dplyr)
df <- tibble(x = c("2XYZ005GHT108", "4T005N108"))
df %>% 
  separate(x, C("Product", "Size", "Country", "Pall"), sep = "[^[:alnum:]]+", remove = FALSE)

Ответы [ 2 ]

3 голосов
/ 23 января 2020

1) разделите Если поля могут иметь переменную длину, но мы знаем, что все второе и четвертое являются цифрами и состоят как минимум из 2 символов, а другие поля содержат не более одного ди git в строке и не будет иметь di git рядом с полем all di git, тогда мы можем заменить любую строку из 2 или более цифр пробелом, той же самой строкой и другим пробелом. Тогда мы можем использовать separate. gsub поместит пробел в конце, указывающий на то, что ожидается 5-е поле, хотя оно и отсутствует, поэтому поглотите это, используя поле NA в выражении separate. (Alternately use the extra = "drop" аргумент separate.)

library(dplyr)
library(tibble)
library(tidyr)

df %>% 
  mutate(x = gsub("(\\d\\d+)", " \\1 ", x)) %>%
  separate(x, c("Product", "Size", "Country", "Pall", NA))
## # A tibble: 2 x 4
##   Product Size  Country Pall 
##   <chr>   <chr> <chr>   <chr>
## 1 2XYZ    005   GHT     108  
## 2 4T      005   N       108 

2) read.pattern Мы можем поочередно использовать read.pattern, предполагая, что первое поле - это di git, за которым следует не цифрами, второе поле - цифры, третье - не-ди git, а четвертое - цифры.

library(gsubfn)

pat <- "^(\\d\\D+)(\\d+)(.*\\D)(\\d+)"
read.pattern(text = df$x, pattern = pat, colClasses = "character",
  col.names = c("Product", "Size", "Country", "Pall"))
##   Product Size Country Pall
## 1    2XYZ  005     GHT  108
## 2      4T  005       N  108

2a) strcapture Это также может быть сделано только с использованием базы R с использованием pat, определенного выше с strcapture, например:

strcapture(pat, df$x, list(Product = character(0), Size = character(0),
  Country = character(0), Pall = character(0)))
##   Product Size Country Pall
## 1    2XYZ  005     GHT  108
## 2      4T  005       N  108
0 голосов
/ 23 января 2020

Вы можете использовать substr для этой цели. Для получения дополнительной информации см. ?substr

df %>% mutate(Product = substr(x, 1,4), Size = substr(x, 5,7))

, если длина вашей строки не фиксирована, проверьте ответ от @ g-grothendieck

...