Wie eine Säule, die eine Reihe von Sternen schaffen Stufen eines Faktors in einem Datenrahmen in R, um anzuzeigen,

StackOverflow https://stackoverflow.com/questions/2585583

  •  24-09-2019
  •  | 
  •  

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?

War es hilfreich?

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

erstellen
vstars <- 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top