2016-08-02 1 views
-1

Ich habe einen Vektor, wie untenExtrakt als Zahlen aus einem String zu berechnen

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

Die obigen Daten ist grundsätzlich Flaschengrößen in einem Fall packen. Was es bedeutet, ist im Fall von "6X75ML" gibt es 6 Flaschen von 75CL (Centi Liter) Flüssigkeit jeder. Für "6X2X75ML", was im Grunde ein Promotion Pack ist, hat 6X2 = 12 Flaschen von 75ML (Milli Liter) in einem Fall. Ich brauche das Volumen in Litern je zu finden: zB -

"6X75ML" sollte (6 * 75 * 0.001) = 0.45 Liter

"24X37.5ML(KKK)" sollte (6 * 37.5 * 0.001) = 0.9 Liter

"6X2X75ML" sollte (6 * 2 * 75 * 0.001) = 0.9 Liter

[es sein sein sein darf maximal 3 Stellen zwischen dem X]

betragen

Conversions: ML - Milli Liter CL - Centi Liter LTR - Liter

1ML = 0.001LTR 
1CL = 0.01LTR 

In einigen Fällen, wie in den oben könnte es Werte wie "168X5CLKK (BUU)", wo nur braucht CL genommen werden .

Ich habe den Code unten hilft mir, die Menge an Flaschen in einem Fall zu finden

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

zB. "6X2X75ML" geben 12; "168X5CL (UUU)" ll geben 168 usw.

Funktion: strplit bricht den Vektor entlang "X". Die resultierende Liste wird an sapply übergeben, die eine Operation an allen außer dem letzten Element jedes Vektors in der Liste durchführt. Die Operation besteht darin, die Elemente in numerische s umzuwandeln und sie zu multiplizieren. Das letzte Element wird mit head (x, -1) gelöscht.

Ich bin nicht in der Lage, einen Weg zu finden um eine effiziente Möglichkeit, das letzte Element aufteilen, um das Volumen zu erhalten.

+0

Hat die (KKK) oder (UUU) alles bedeuten?Sie könnten Regex verwenden, um alles in Klammern zu entfernen. Dann können Sie das vorletzte Zeichen verwenden, um zu bestimmen, mit welchem ​​10^n Sie multiplizieren möchten. (M, C oder T) – tluh

+0

Sie sollten Ihr Beispiel beheben. Sie haben "6X75CL" 'im Text aber" 6X75ML "' in den Daten. –

+0

Hallo alle, kann wone überprüfen mit ein paar anderen Beispielen wie: "6X180CL (LMD)", "6X75CL (JIH) (DELIST)". Es scheint hier nicht zu funktionieren. – Ashwin

Antwort

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

ersetzen ML mit X0.001

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

CL Ersetzen mit x0.01

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

die Zeichenfolge aufgeteilt und machen die Multiplikation

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

Ausgang:

[1] 0.45 0.90 0.90 8.40 8.40 
+1

Die Ausgabe stimmt nicht mit dem Beispiel überein –

+0

Das Hinzufügen eines Leerzeichens in der Regex wird es beheben – FisherDisinformation

+0

In Ihrer vorherigen Antwort, switching '" [AZ()] * $ "' für '" [AZ()] * $ "' würde ' produziert die gewünschte Ausgabe. – FisherDisinformation

0

Sathish Lösung ist unkompliziert.

Wenn Sie benötigen das Volumen und die Anzahl der Flaschen zu extrahieren und zu speichern, können Sie auch diesen Code verwenden:

# 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