2016-10-01 6 views
2

Ich habe einen ‚Daten‘ Rahmen, mit mehreren Spalten, von denen einer ‚Laufzeit‘ ist, die Daten in beiden Formaten aufweist:R Streifen aufgespalten eine Spalte in Datenrahmen

Runtime 
1 h 10 min 
67 min 
1 h 0 min 
86 min 
97 min 

ich will alle von ihnen konvertieren in Minuten. Habe 'strsplit' und 'strip_split_fixed' versucht. Kann mir jemand einen Weg zeigen, mein Ziel, Split oder eine andere Methode zu erreichen?

Vielen Dank im Voraus!

+0

Ist es derzeit eine Zeichenkette? Oder ein Faktor? – CephBirk

+3

Dies ist kein R-Ausgang. Können Sie den tatsächlichen R-Code für Ihr Beispiel angeben? Dies vermeidet "Oh Ihre Lösung funktioniert an meinem Beispiel, aber nicht meine tatsächlichen Daten" –

Antwort

0

Hier ist ein Beispiel dafür, wie Sie es tun können:

# setting up your data.frame of interest 
df = data.frame(Runtime = c('1 h 10 min', '67 min', '1 h 0 min', '86 min', '97 min')) 



df$Runtime = gsub(' min', '', df$Runtime) # remove the min labels 
hrs = grepl('h', x = df$Runtime) # which values are in an "x h y min" format? 
runtime_sub = sapply(strsplit(df[hrs, 'Runtime'], ' h '), function(i) sum(as.numeric(i) * c(60, 1))) # convert the "x h y min" entries into numeric values in minutes 
df$Runtime = as.numeric(df$Runtime) # convert the vector to numeric (yes, it's supposed to return a warning. Ignore it. 
df[hrs, 'Runtime'] = runtime_sub # add the converted values 

Daraus ergibt sich:

Runtime 
1  70 
2  67 
3  60 
4  86 
5  97 
+0

absolutes Genie !! Vielen Dank CephBirk –

+0

Kein Problem kash. Welche Antwort Sie am hilfreichsten finden, Sie können sie mit einem grünen Häkchen markieren und/oder markieren. So kann jeder wissen, was Sie am hilfreichsten fanden. – CephBirk

8

Ich glaube, ich habe irgendwo diese Art der Lösung. Schlag mich nicht.

df = data.frame(Runtime = c('1 h 10 min', '67 min', '1 h 0 min', '86 min', '97 min')) 

df$exp <- gsub("h", "* 60 +", df$Runtime) 
df$exp <- gsub("min", "* 1", df$exp) 

sapply(df$exp, FUN = function(x) eval(parse(text = x))) 

1 * 60 + 10 * 1   67 * 1 1 * 60 + 0 * 1   86 * 1   97 * 1 
      70    67    60    86    97 
2

Sie können einen Anruf erhalten mit gsubfn und regex:

library(gsubfn) 
gsubfn("^(?:(\\d+)\\s*h)?\\s*(\\d+)\\s*min.*$", 
~ sum(as.numeric(x) * 60, as.numeric(y), as.numeric(z), na.rm=TRUE), x) 
#[1] "70" "67" "60" "86" "97" 
+0

Danke Pierre. Das ist wirklich beeindruckend. Ich habe versucht, Ihre Methode in einem anderen Problem zu implementieren, aber stecken geblieben. Ich habe ähnliches Problem wo, ich habe finanzielle Werte wie; Budget: 2.00E + 07, 7.50E + 07, 500000, 3.05E + 07. Nicht sicher, wie ich Ihre Formel ändern sollte, um alle Finanzen in 10 zu erhalten –

+0

verwenden Sie 'Optionen (scipen = 15)'. dann versuche es nochmal –

+1

toll !! Danke. Wenn es nicht Ozeane des Wissens wie Sie gäbe, wären Teiche wie wir ausgetrocknet –

0

1) lesen df[[1]] und wenn die dritte Spalte NA dann die erste Spalte gibt die Minuten; Ansonsten 60 mal der ersten Spalte und der dritten Spalte gibt die Minuten:

with(read.table(text = as.character(df[[1]]), fill = TRUE), 
     ifelse(is.na(V3), V1, 60*V1 + V3)) 
## [1] 70 67 60 86 97 

2) Eine Variante ist „0 h“ zu Beginn einer jeden Komponente einzufügen, die kein H hm geben hat und lese, dass 60 mal die erste Spalte plus die dritte Spalte berechnet wird.

hm <- paste(ifelse(grepl("h", df[[1]]), "", "0 h"), df[[1]]) 
with(read.table(text = hm), 60 * V1 + V3) 
## [1] 70 67 60 86 97 
Verwandte Themen