ich einen Datenrahmen ähnlich wie diese Probe haben:Optimieren: Wertersatz in Datenrahmen Wiith mehrere Bedingungen
df <- structure(list(Ball = structure(c(5L, 3L, 2L, 4L, 1L, 3L), .Label = c("blue", "blue is my favourite", "red", "red ", "red ball"), class = "factor"), size = c(1.2, 2, 3, 10, 12, 100)), .Names = c("Ball", "size"), class = "data.frame", row.names = c(NA, -6L))
Basierend auf den Informationen in den beiden Spalten ich die Einzelteile durch Größe und Farbe klassifizieren möchten. Die Ausgabe sollte wie folgt aussehen:
structure(list(Ball = structure(c(5L, 3L, 2L, 4L, 1L, 3L), .Label = c("blue", "blue is my favourite", "red", "red ", "red ball"), class = "factor"), size = c(1.2, 2, 3, 10, 12, 100), Class = c("small red ball", "small red ball", "small blue ball", "medium red ball", "medium blue ball", "big red ball")), row.names = c(NA, -6L), .Names = c("Ball", "size", "Class"), class = "data.frame")
I-Code ausgeführt haben, aber es ist sehr lang und chaotisch, und ich bin sicher, es ist eine nette Art und Weise meine gewünschte Ausgabe zu erhalten.
Also was habe ich getan?
Ich begann mit den Elementen der ersten Klasse auswählen und benennen Sie die ausgewählten df$Class
Werte:
df["Class"] <- NA #add new column
df[grepl("red", df$Ball) & df$size <10, ]$Class <- "small red ball"
und weil meine Grepl-Auswahl manchmal leer ist, habe ich einen if (length() > 0
) Zustand:
if (length(df[grepl("red", df$Ball) & df$size <10, ]$Class) > 0) {df[grepl("red", df$Ball) & df$size <10, ]$Class <- "small red ball"}
und schließlich ich kombiniert alle meine Auswahl in einer Schleife
df["Class"] <- NA #add new column
z <- c("red", "blue")
for (i in z){
if (length(df[grepl(i, df$Ball) & df$size <10, ]$Class) > 0) {df[grepl(i, df$Ball) & df$size <10, ]$Class <- paste("small", i, "ball", sep=" ")}
if (length(df[grepl(i, df$Ball) & df$size >=10 & df$size <100, ]$Class) > 0) {df[grepl(i, df$Ball) & df$size >=10 & df$size <100, ]$Class <- paste("medium", i, "ball", sep=" ")}
if (length(df[grepl(i, df$Ball) & df$size >=100, ]$Class) > 0) {df[grepl(i, df$Ball) & df$size >=100, ]$Class <- paste("big", i, "ball", sep=" ")}
}
Es funktioniert für zwei Farben und drei Größenkategorien, aber mein ursprünglicher Datenrahmen ist viel größer. Deshalb (und weil es so chaotisch aussieht), meine Frage: Wie kann ich meinen Code vereinfachen?
Ich sehe nicht die Essenz des 'saithr'-Pakets. Ich denke, Basis r funktioniert fin: 'einfügen (as.character (cut (df $ size, c (1,10,100, Inf), c (" klein "," mittel "," groß "))), sub (" [^ (rot | blau)]. * "," ", df $ Ball), 'Ball')' – Onyambu
@Onyambu Sicher funktioniert das 'sub', aber wenn es keine Übereinstimmungen gibt, dann könnte es die ganze Zeichenfolge wo zurückgeben als 'str_extract' gibt NA zurück. Eine Umgehungslösung wäre "regexpr/regmatches" – akrun
Die Unterbrechungen sollten "c (1, 9, 99, Inf)" für "klein: x <10", "mittel 10 <= x <100", "groß: x>" sein = 100', oder? – Iris