2017-10-19 2 views
0

Wie würde ich eine Spalte wie diese trennen, wo die Daten Trennzeichen hat, aber der Rest nicht und es hat einige ungleiche Zeichenketten?Trenne eine Spalte mit ungeraden/ungleichen Strings und ohne Trennzeichen

Input: id

142 TM500A2013PISA8/22/17BG
143 TM500CAGE2012QUDO8/22/1720 +

Ausgang:

Kategorie Ort Schrebergarten Jahr Arten Datum Teil 142 TM 500 A 2013 PISA 22.08.17 BG 143 TM 500 CAGE 2012 Qudo 8/22/17 20+

ich stocherte andere Fragen und versucht, etwas, das funktionieren kann, wenn es eine gleiche Zeichenfolge dh war:

>df <- avgmass %>% separate(id, c("site", "garden", "plot", "year", 
    "species", "sampledate", "portion"),sep=cumsum(c(2,3,3,4,4,5))) 

Aber als der Plot-ID ist entweder A , B oder CAGE; das Datum hat "/" - ich bin nicht sicher, wie ich es angehen soll.

Da ich relativ neu in R bin, habe ich versucht, mehr Details darüber zu finden, wie man das sep Argument benutzt, aber ohne Erfolg ... Danke für Ihre Hilfe.

+0

, wenn es nicht von fester Länge ist, versuchen Sie mit '? Extract' – akrun

+1

Könnten Sie zeigen die erwartete Ausgabe – akrun

+1

Wir haben keine Ahnung, was diese Buchstaben und Zahlen bedeuten. Welche Regeln gelten für das Aufteilen von Feldern? Warum in der Welt sind die Daten so formatiert? – MrFlick

Antwort

0

Der unten stehende Code funktioniert möglicherweise, wenn Sie davon ausgehen, dass die Spalten "Standort", "Garten" und "Arten" eine feste Breite haben.

df <- df %>% 
     mutate(site = substr(id, 1, 2), 
      garden = substr(id, 3, 5), 
      plot = ifelse(substr(id, 6, 9) == "CAGE", substr(id, 6, 9), substr(id, 6, 6)), 
      year = ifelse(substr(id, 6, 9) == "CAGE", substr(id, 10, 13), substr(id, 7, 10)), 
      species = ifelse(substr(id, 6, 9) == "CAGE", substr(id, 14, 17), substr(id, 11, 14)), 
      sampledate = ifelse(substr(id, 6, 9) == "CAGE", substr(id, 18, nchar(id)), substr(id, 15, nchar(id)))) %>% 
      separate(sampledate, into = c("m","d","y"), sep = "/") %>% 
      mutate(portion = substr(y, 3, nchar(y)), 
        sampledate = as.Date(paste(m, d, substr(y, 1, 2), sep = "-"), format = "%m-%d-%y"), 
        m = NULL, 
        d = NULL, 
        y = NULL) 
+0

Wenn Sie die "id" -Spalte selbst erstellen, wäre es wahrscheinlich besser, ein Trennzeichen zwischen die Felder einzufügen und diese später zum Trennen der Spalten zu verwenden. –

+0

Danke! Ich habe versucht, dies auszuführen, und es gab Probleme beim Eingeben eines Teils nach dem Datum, aber ich nahm Ihren Rat und fügte ein Trennzeichen hinzu, wenn ich meine Spalten vereinte und dann die separate Funktion verwendete. Es hat wunderbar funktioniert! – Andrew

Verwandte Themen