Comment créer une colonne contenant une chaîne d'étoiles pour indiquer les niveaux d'un facteur dans une trame de données en R
Question
(deuxième question aujourd'hui - doit être une mauvaise journée)
J'ai dataframe avec différentes colonnes, inculding une colonne de concentration (numérique), un drapeau mettant en évidence des résultats non valides (booléens) et une description du problème (caractère)
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")
Je peux créer une colonne avec le niveau numérique de la colonne de raison
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
et voici ce que je veux faire pour créer une colonne avec beaucoup d'étoiles « niveau », mais il échoue
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
Il semble que représentant doit être alimenté une valeur à la fois. Je pense que cela devrait être possible (et mon tube digestif dit « utiliser lapply » mais mon application fu est v. Pauvres)
Tout le monde veut essayer?
La solution
Je pense que vous aurez besoin d'une fonction de type applicable. Cela fonctionne:
df[is.na(df$level),"level"] <- 0
df$level <- sapply(df$level, function(x) paste(rep("*",x),collapse=""))
Vous seriez mieux à l'aide sapply
que lapply
dans ce cas, car il retourne un vecteur au lieu d'une liste.
De l'aide pour rep:
Si « temps » se compose d'un seul nombre entier, le résultat se compose de toute entrée répété cela plusieurs fois. Si « temps » est un vecteur de la même longueur que « x » (après la réplication par chaque '), le résultat consiste en 'x [1]' 'répétées fois [1]' fois, 'X [2]' 'temps [2]' répétées fois et ainsi de suite.
Un problème avec l'utilisation rep
avec un vecteur pour le paramètre temps est qu'il retourne juste un vecteur et défausse cas lorsque les temps = 0. Vous pouvez le voir avec cette commande:. rep(rep("*", nrow(df)), times=df$level)
Autres conseils
Vous pouvez créer étoiles vecteur
vstars <- sapply(1L:nlevels(df$reason), function(i) paste(rep("*",i),collapse=""))
vstars
# [1] "*" "**"
Et puis l'indexation avec df$reason
(qui fonctionne parce que son facteur):
vstars[df$reason]
# [1] NA NA "**" NA NA NA "**" "*" NA NA
Pour les grandes data.frame
devrait être beaucoup plus rapide alors paste
dans chaque ligne.