Wie eine Säule, die eine Reihe von Sternen schaffen Stufen eines Faktors in einem Datenrahmen in R, um anzuzeigen,
Frage
(zweite Frage heute - muss ein schlechter Tag sein)
Ich habe einen Datenrahmen mit verschiedenen Spalten, inculding eine Konzentration Spalte (numerisch), einen Flag markiert ungültige Ergebnisse (boolean) und eine Beschreibung des Problems (Zeichen)
df <- structure(list(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), rawconc = c(77.4,
52.6, 86.5, 44.5, 167, 16.2, 59.3, 123, 1.95, 181), reason = structure(c(NA,
NA, 2L, NA, NA, NA, 2L, 1L, NA, NA), .Label = c("Fails Acceptance Criteria",
"Poor Injection"), class = "factor"), flag = c("False", "False",
"True", "False", "False", "False", "True", "True", "False", "False"
)), .Names = c("x", "rawconc", "reason", "flag"), row.names = c(NA,
-10L), class = "data.frame")
kann ich eine Spalte mit der numerischen Ebene der Grund Spalte erstellen
df$level<-as.numeric(df$reason)
df
x rawconc reason flag level
1 1 77.40 <NA> False NA
2 2 52.60 <NA> False NA
3 3 86.50 Poor Injection True 2
4 4 44.50 <NA> False NA
5 5 167.00 <NA> False NA
6 6 16.20 <NA> False NA
7 7 59.30 Poor Injection True 2
8 8 123.00 Fails Acceptance Criteria True 1
9 9 1.95 <NA> False NA
10 10 181.00 <NA> False NA
und hier ist das, was ich eine Spalte erstellen mit ‚Ebene‘ viele Stars machen will, aber es funktioniert nicht
df$stars<-paste(rep("*",df$level)sep="",collapse="")
Error: unexpected symbol in "df$stars<-paste(rep("*",df$level)sep"
df$stars<-paste(rep("*",df$level),sep="",collapse="")
Error in rep("*", df$level) : invalid 'times' argument
rep("*",df$level)
Error in rep("*", df$level) : invalid 'times' argument
df$stars<-paste(rep("*",pmax(df$level,0,na.rm=TRUE)),sep="",collapse="")
Error in rep("*", pmax(df$level, 0, na.rm = TRUE)) :
invalid 'times' argument
Es scheint, dass rep Bedürfnisse einen Wert zu einem Zeitpunkt zugeführt werden. Ich glaube, dass dies möglich sein sollte (und mein Bauch sagt ‚Verwendung lapply‘ aber meine fu gelten v. Schlecht)
wollen Jeder versuchen?
Lösung
Ich glaube, dass Sie eine Anwendung vom Typ Funktion benötigen. Dies funktioniert:
df[is.na(df$level),"level"] <- 0
df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))
Sie würden besser mit sapply
als lapply
in diesem Fall, da es einen Vektor anstelle einer Liste zurück.
Von der Hilfe für rep:
Wenn ‚mal‘ besteht aus einem einzigen integer, besteht das Ergebnis die ganze Eingabe wiederholt dies viele Male. Wenn ‚mal‘ ist ein Vektor die gleiche Länge wie ‚x‘ (nach der Replikation durch ‚jeweils‘), die Ergebnis besteht aus 'x [1]' wiederholt 'mal [1]' mal 'x [2]' wiederholt 'mal [2]' Zeiten und so weiter.
Ein Problem bei der Verwendung rep
mit einem Vektor für die Zeiten Parameter ist, dass es nur einen Vektor zurückgibt und es verwirft Fälle, wenn mal = 0. Sie können dies mit diesem Befehl finden Sie unter:. rep(rep("*", nrow(df)), times=df$level)
Andere Tipps
Sie könnten Sterne-Vektor als
erstellenvstars <- sapply(1L:nlevels(df$reason), function(i) paste(rep("*",i),collapse=""))
vstars
# [1] "*" "**"
Und die Indizierung es dann mit df$reason
(der wegen seines Faktors funktioniert):
vstars[df$reason]
# [1] NA NA "**" NA NA NA "**" "*" NA NA
Für große data.frame
sollten viel schneller als paste
in jeder Zeile sein.