2016-08-02 3 views
-1

У меня есть вектор, как показано нижеэкстракта в виде чисел из строки Вычислить

data <- c("6X75ML","24X37.5ML(KKK)", "6X2X75ML", "168X5CL (UUU)", "168X5CLKK (BUU)") 

выше данные, в основном упаковки размеров бутылок в случае. Это означает, что в случае «6X75ML» имеется 6 бутылок из 75CL (Centi liters). Для «6X2X75ML», который в основном представляет собой пакет поощрений, имеет 6X2 = 12 бутылок 75 мл (миллилитра) в корпусе. мне нужно найти объем в литрах, имеющихся в каждом конкретном случае: например -

"6X75ML" должен быть (6 * 75 * 0.001) = 0.45 литров

"24X37.5ML(KKK)" должен быть (6 * 37.5 * 0.001) = 0.9 литров

"6X2X75ML" должен быть (6 * 2 * 75 * 0.001) = 0.9 литров

[там может быть не более 3 цифр между X]

Конверсии: ML - Milli литров CL - Centi литров LTR - литры

1ML = 0.001LTR 
1CL = 0.01LTR 

В некоторых случаях, как и в выше не может быть ценности, как "168X5CLKK (Буу)", где нужно только CL быть приняты ,

У меня есть код ниже помогает мне найти количество бутылок в случае

dataList <- strsplit(data, split="X") 
Pack <- sapply(dataList, function(x) prod(as.numeric(head(x, -1)))) 

например. «6X2X75ML» даст 12; «168X5CL (UUU)» дает 168 и т. Д.

Работая: strplit разбивает вектор вдоль «X». Полученный список подается в sapply, который выполняет операцию на всех, кроме конечного элемента каждого вектора в списке. Операция состоит в том, чтобы преобразовать элементы в числовые s и умножить их. Последний элемент отбрасывается с помощью head (x, -1).

Я не могу найти способ эффективный способ разбиения последнего элемента на получение тома.

+0

значат ли (ККК) или (УУУ)?Вы можете использовать регулярное выражение, чтобы вырезать что-либо в скобках. Затем вы можете использовать второй-последний символ, чтобы определить, что 10^n, которое вы хотите размножить. (M, C или T) – tluh

+0

Вы должны исправить свой пример. У вас есть «6X75CL» в тексте, но «6X75ML» в данных. –

+0

Привет всем, может ли любая проверка с несколькими другими примерами, например: «6X180CL (LMD)», «6X75CL (JIH) (DELIST)». Кажется, здесь это не работает. – Ashwin

ответ

1
data <- c("6X75ML","24X37.5ML(KKK)", "6X2X75ML", "168X5CL (UUU)", "168X5CLKK (BUU)") 

Заменить ML с X0.001

data <- gsub("ML", "X0.001", data) 

Заменить CL с X0.01

data <- gsub("CL", "X0.01", data) 

разделить строку и сделать умножение

unlist(lapply(strsplit(gsub("[A-Z() ]*$", "", data), "X"), function(x){ prod(as.numeric(x))})) 

Выход:

[1] 0.45 0.90 0.90 8.40 8.40 
+1

Вывод не соответствует примеру –

+0

Добавление пробела в регулярное выражение исправит его – FisherDisinformation

+0

В вашем предыдущем ответе переключение '' [AZ()] * $ "' for '" [AZ()] * $ "' будет ' ve произвел желаемый результат. – FisherDisinformation

0

Решение Sathish прямолинейно.

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

# Data 
data <- c("6X75ML","24X37.5ML(KKK)", "6X2X75ML", "168X5CL (UUU)", "168X5CLKK (BUU)") 


# (1) Calculate volume per unit/bottle 
# ------------ 

# Get volume measurement: 
# Extract bottle volume and define conversion factor 
bottle.volumes.units <- substr(sub(".*X[0-9,.]+", "", data), 0, 2) 
bottle.volumes.in.liter <- gsub("ML", 0.001, bottle.volumes.units) 
bottle.volumes.in.liter <- gsub("CL", 0.01, bottle.volumes.in.liter) 

# Get volume per bottle 
# All numbers in every vector 
all.numbers <- regmatches(data, gregexpr('\\(?[0-9,.]+', data)) 
# The volume information for each bottle 
bottle.volumes <- as.numeric(unlist(lapply(all.numbers, last))) 

# Harmonize volume measuremet to "liters" 
bottle.volumes.in.liters <- as.numeric(bottle.volumes.in.liter) * bottle.volumes 


# (2) Get the number of units/bottles 
# ------------ 
number.of.bottles.temp <- lapply(all.numbers, function(x)as.numeric(setdiff(x, as.list(bottle.volumes)))) 
number.of.bottles <- sapply(number.of.bottles.temp, prod) 


# (3) Calculate volume 
# ------------ 
number.of.bottles * bottle.volumes.in.liters 

# [1] 0.45 0.90 0.90 8.40 8.40 
Смежные вопросы