R - сопоставить несколько строк, исключая непреднамеренные совпадения - PullRequest
0 голосов
/ 29 марта 2019

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

Некоторые примеры данных выглядят так:

df <-
rbind(data.frame(text = "199-50 150g4_qty_+ 200g4_qty_"),
      data.frame(text = "chouffe/ 330ml*2_qty_+ 330ml*2_qty_+ 330ml*2_qty_"),
      data.frame(text = "1000g( 500g+ 500g) _qty_"),
      data.frame(text = "(abbott) 900g+50g 2 950g"),
      data.frame(text = "1kg 2kg 3kg 1kg +2kg"),
      data.frame(text = "200ml*18_qty_ +putzi 50ml"),
      data.frame(text = "( 250ml*6_qty_+ 250ml*4_qty_+ 190ml*6_qty_+ 200ml*4_qty_)"),
      data.frame(text = "128g+ 128g+ 128g 384g"))

Посредством трала этого сайта и методом проб и ошибок я написал код, который извлекает нужные мне значения, а также некоторые из них, которые мне не нужны.

df1 <- regmatches(df$text, gregexpr("\\d+(ml|l|g|kg)", df$text))
df1 <- as.data.frame(t(sapply(df1, '[', seq(max(sapply(df1, length))))))  

Я получаю:

    V1       V2       V3        V4      V5
1   150g     200g     NA        NA      NA
2   330ml    330ml    330ml     NA      NA
3   1000g    500g     500g      NA      NA
4   900g     50g      950g      NA      NA
5   1kg      2kg      3kg       1kg     2kg
6   200ml    50ml     NA        NA      NA
7   250ml    250ml    190ml     200ml   NA
8   128g     128g     128g      384g    NA 

, который в основном есть, но я хочу исключить лишние значения, такие как повторы (строка 5) и итоги (строки 3, 4 и 8). Конечный результат должен быть:

    V1       V2       V3        V4      
1   150g     200g     NA        NA      
2   330ml    330ml    330ml     NA     
3   500g     500g     NA        NA      
4   900g     50g      NA        NA
5   1kg      2kg      NA        NA
6   200ml    50ml     NA        NA      
7   250ml    250ml    190ml     200ml   
8   128g     128g     128g      NA

Я определил, что между значениями, которые я хочу сохранить, должен быть +. Например, строка 3 имеет + между 500 г и 500 г, поэтому я хочу сохранить оба эти значения, но я не хочу сохранять 1000 г, поскольку между ними и 500 г нет +. Точно так же, нет + непосредственно перед 384g в строке 8.

Я просто не знаю, как использовать регулярные выражения для реализации этого, не поднимая + слишком далеко.

1 Ответ

1 голос
/ 01 апреля 2019

Мое решение после рассмотрения этого с многих сторон состояло в том, чтобы удалить пробелы вокруг плюсов:

df$text <- gsub("\\s+(?=\\+)|(?<=\\+)\\s+", "", df$text, perl=TRUE)

Затем разбейте строку на элементы в соответствии с оставшимися пробелами:

var1 <- strsplit(df$text, "\\s+")

Затем используйте grepl, чтобы выбрать элемент, который содержит плюсы, таким образом удаляя все элементы, которые не содержат +:

var2 <- lapply(var1, function(x) x[grepl("\\+", x, perl=TRUE)])

И, наконец, используйте код, созданный ранее, чтобы сохранить необходимые строки:

df1 <- regmatches(var2, gregexpr("\\d+(ml|l|g|kg)", var2))
df1 <- as.data.frame(t(sapply(df1, '[', seq(max(sapply(df1, length)))))) 

Это приводит меня в чувство, когда я немного повозился по краям, возможно, все еще требующийся для обработки случайных случаев.

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