Wie vielleicht durch den Titel vorgeschlagen, ist diese Frage ein Follow-up zu diesem ähnlich betitelten question. Dort fragte ich, wie man eine Zeichenspalte eines Datenrahmens in mehrere numerische Spalten unter Verwendung des Trennzeichens _
aufteilt und Ergebnisse bereinigt. In diesem Fall waren alle Spalten numerisch und sie wurden aus den folgenden Elementen der geteilten Spalten erstellt, sodass die Lösung einfacher war. Dieses Mal sind die Dinge ein wenig anders:Erstellen Sie mehrere Spalten * in einem anderen Format * aus einer einzelnen Spalte und bereinigen Sie die Ergebnisse
foo <- data.frame(Point.Type = c("Zero Start","Zero Start", "Zero Start", "3000rpm_10%_13barG_Sdsdsa_1.0_F_Pww","3000rpm_10%_13barG_Sdsdsa_1.0_F_Pww","3000rpm_10%_13barG_Sdsdsa_1.0_R_Pww","Zero Stop","Zero Start"),
Point.Value = c(NA,NA,NA,rnorm(3),NA,NA))
Von Spalte Point.Type
, ich brauche vier Spalten zu erstellen, rpm
, GVF
, p0
und Setup
.
rpm
,GVF
,p0
müssen vom Typnumeric
oderinteger
sein, währendSetup
vom Typcharacter
sein muss.- Alle vier neuen Spalten müssen auf
NA
gesetzt werden, wennPoint.Type
keine_
enthält (Zeilen 1,2,3,7,8 in meinem Beispiel). - wenn
Point.Type
ein_
enthält, dannrpm
,GVF
,p0
muß die ersten drei Elemente vonPoint.Type
enthalten, „gereinigt“ von allen nicht numerischen Zeichen.Setup
muss gleichFull
sein, wenn das 6. Element vonPoint.Type
gleichF
ist, andernfalls muss es gleichReduced
sein. In meinem Beispiel bedeutet dies, dassSetup
sollteFull
für die Zeilen 4 und 5 zuReduced
für Zeile 6.
Um die drei numeric
Spalten gleich sein, verwende ich die ausgezeichnete Lösung von @Procrastinatus_Maximus, hier etwas umformuliert :
library(dplyr)
foo <- foo %>%
separate(Point.Type, c("rpm", "GVF", "p0"),
sep="_", remove = FALSE, extra="drop", fill="right") %>%
mutate_each(funs(as.numeric(gsub("[^0-9]","",.))), rpm, GVF, p0)
Nun ist das Problem der character
Spalte, Setup
. Schreiben Sie einfach naiv
library(dplyr)
foo <- foo %>%
separate(Point.Type, c("rpm", "GVF", "p0","Setup"),
sep="_", remove = FALSE, extra="drop", fill="right") %>%
mutate_each(funs(as.numeric(gsub("[^0-9]","",.))), rpm, GVF, p0,Setup)
wird nicht funktionieren, weil der Wert von Setup
nicht auf das Element von Point.Type
unmittelbar nach p0
zusammenhängt. Der Wert von Setup
hängt auch davon ab, ob das sechste Element Point.Type
F
oder R
ist, aber dies sind character
Werte und sie werden einfach von mutate_each(funs(as.numeric(gsub("[^0-9]","",.))),...
weggefegt. Ich habe irgendwo mit diesem Code:
library(dplyr)
foo <- foo %>%
separate(Point.Type, c("rpm", "GVF", "p0"),
sep="_", remove = FALSE, extra="drop", fill="right") %>%
mutate_each(funs(as.numeric(gsub("[^0-9]","",.))), rpm, GVF, p0)
library(stringr)
foo$Setup <- ifelse(str_split_fixed(setup$Point.Type,"_",7)[,6]=="F",
"Full","Reduced")
, die mir jedoch
Point.Type rpm GVF p0 Point.Value Setup
1 Zero Start NA NA NA NA Reduced
2 Zero Start NA NA NA NA Reduced
3 Zero Start NA NA NA NA Reduced
4 3000rpm_10%_13barG_Sdsdsa_1.0_F_Pww 3000 10 13 1.9188554 Full
5 3000rpm_10%_13barG_Sdsdsa_1.0_F_Pww 3000 10 13 -0.5743683 Full
6 3000rpm_10%_13barG_Sdsdsa_1.0_R_Pww 3000 10 13 -0.7122796 Reduced
7 Zero Stop NA NA NA NA Reduced
8 Zero Start NA NA NA NA Reduced
gibt, wie Sie es noch nicht sehen können nicht funktionieren: Setup
gleich Reduced
auch in jenen Fällen, wo es sein sollte gleich NA
. Auch, ehrlich gesagt mag ich nicht die Idee, stringr
zu laden, nur um Setup
zu erstellen. Ich würde viel lieber den ganzen Job in dplyr
machen, vorzugsweise in einer einzigen Codezeile mit Pipes. Wenn das zu unlesbarem Code führt, wären zwei aufeinanderfolgende Aufrufe an dplyr
ebenfalls in Ordnung.
Ich sehe nicht wirklich, wie diese Frage "zu breit" wäre, während die vorhergehende (von der dies nur eine hoffentlich einfache Erweiterung ist) nicht allzu breit war. Warum würde es zu weit gefasst sein, nur eine weitere Spalte zu verwalten? – DeltaIV