Извлечь значения из строки в R - PullRequest
2 голосов
/ 18 марта 2020

У меня есть столбец «product_list» в кадре данных, который выглядит следующим образом: «; 165533; 3; 1050.00;,; 165535; 1; 700.00;

Это список продуктов, купленных в рамках покупки id. В приведенном выше примере 165533 - это SKU, 3 - это количество приобретенных продуктов, 1050.00 - это сумма покупки и т. д. Это поле может содержать несколько SKU для продукта. Несколько SKU разделены запятой. Я хочу извлечь только из SKU эта строка в R с использованием регулярного выражения, с которым я новичок.

str = c(";165533;3;1050.00;,;165535;1;700.00;")

Я смог разделить SKU, используя ниже:

strsplit(Type, ",;"). 

Мой вопрос заключается в том, как извлечь только первое значение из значений, разделенных запятыми.

Я хочу, чтобы конечный результат выглядел следующим образом:

Purchase ID  SKU
123          165533
123          165535

Есть ли лучший способ извлечь эти данные?

Здесь является выводом dput:

структура dput (Purchase_test [, c (1, 2)]) (список (post_purchaseid = c (123L, 456L, 321L, 888L, 345L, 938L) , 647L, 657L, 687L, 547L, 647L, 711L, 811L, 911L, 1001L), post_product_list = структура (c (6L, 4L, 11L, 9L, 2L, 5L, 7L, 1L, 3L, 4L, 10L, 8L, 4L, 12L, 13L), .Label = c ("; 153147; 1 ; 100,00;;; 165533; 1; 350,00;;; 165537; 1; 3800,00; ","; 153147; 1; 100,00;;; 165533; 3; 1050,00;;; 165531; 1; 200,00;;; 165535; 1 ; 700,00; ","; 153147; 1; 100,00;;;; 165533; 3; 1050,00;;;; 165536; 1; 2750,00; ","; 153147; 1; 100,00;;; 165535; 1; 700,00; "," ; 153147; 1; 100,00;;; 165535; 2; 1400,00; ","; 153147; 1; 12,05;,; 165531; 1; 24,11;;; 153418; 5; 500,00; ","; 153147; 1; 15,34 ;,; 165533; 1; 53,70; ","; 153147; 1; 31,51;;; 153418; 2; 200,00; ","; 153147; 1; 43,84;;; 165531; 1; 87,67; ","; 153147 ; 1; 49,86;,; 165533; 1; 174,52; ","; 165533; 3; 1050,00;,; 165535; 1; 700,00; ","; создание первого текста; 1; 4200,00; 207 = 4200,00;,; Начало работы с; 1; 3900,00; 207 = 3900,00; ","; Начало работы с; 1; 3900,00; 207 = 3900,00; "), class =" factor ")), class =" data.frame ", row.names = c (NA, -15L))

Ответы [ 3 ]

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

Мы можем извлечь с помощью str_extract_all и unnest столбец list, чтобы развернуть строки

library(dplyr)
library(tidyr)
library(stringr)
out <- Purchase_test %>% 
     mutate(SKU = str_extract_all(post_product_list, "(?<=(^|,);)[^;]+")) %>% 
     unnest(c(SKU))
out
# A tibble: 34 x 3
#   post_purchaseid post_product_list                                                        SKU   
#             <int> <fct>                                                                    <chr> 
# 1             123 ;153147;1;12.05;,;165531;1;24.11;,;153418;5;500.00;                      153147
# 2             123 ;153147;1;12.05;,;165531;1;24.11;,;153418;5;500.00;                      165531
# 3             123 ;153147;1;12.05;,;165531;1;24.11;,;153418;5;500.00;                      153418
# 4             456 ;153147;1;100.00;,;165535;1;700.00;                                      153147
# 5             456 ;153147;1;100.00;,;165535;1;700.00;                                      165535
# 6             321 ;165533;3;1050.00;,;165535;1;700.00;                                     165533
# 7             321 ;165533;3;1050.00;,;165535;1;700.00;                                     165535
# 8             888 ;153147;1;43.84;,;165531;1;87.67;                                        153147
# 9             888 ;153147;1;43.84;,;165531;1;87.67;                                        165531
#10             345 ;153147;1;100.00;,;165533;3;1050.00;,;165531;1;200.00;,;165535;1;700.00; 153147
# … with 24 more rows

out$SKU
#[1] "153147"                   "165531"                   "153418"                   "153147"                  
#[5] "165535"                   "165533"                   "165535"                   "153147"                  
#[9] "165531"                   "153147"                   "165533"                   "165531"                  
#[13] "165535"                   "153147"                   "165535"                   "153147"                  
#[17] "165533"                   "153147"                   "165533"                   "165537"                  
#[21] "153147"                   "165533"                   "165536"                   "153147"                  
#[25] "165535"                   "153147"                   "165533"                   "153147"                  
#[29] "153418"                   "153147"                   "165535"                   "creating your first text"
#[33] "Get started with"         "Get started with"  
0 голосов
/ 18 марта 2020

Вы можете извлечь совпадения с помощью регулярного выражения

(?<=;)\d+(?=;\d+;\d+\.\d+)

Демо

Регулярное выполнение выполняет следующие операции:

(?<=;)  # match ';' in a positive lookbehind
\d+     # match 1+ digits (SKU)
(?=     # begin a positive lookahead
  ;\d+  # match ';' then 1+ digits
  ;\d+  # match ';' then 1+ digits
  \.\d+ # match '.' then 1+ digits
)       # end positive lookahead

положительный вид сзади и вперед - это нулевая ширина совпадений, что означает, что они не являются частью полного совпадения; они просто обеспечивают соблюдение требований.

Если в SKU должно быть шесть цифр, вы можете заменить первый \d+ на \d{6}.

0 голосов
/ 18 марта 2020

Ваши данные немного не соответствуют ожидаемому результату (где «идентификатор покупки»?), Но я не думаю, что вам нужно здесь регулярное выражение.

read.csv2(text=gsub(",", "\n", ";165533;3;1050.00;,;165535;1;700.00;"), header=FALSE)
#   V1     V2 V3      V4 V5
# 1 NA 165533  3 1050.00 NA
# 2 NA 165535  1  700.00 NA

и оттуда вы можете отбросить столбцы, назовите их, et c.

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