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

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

  •  24-09-2019
  •  | 
  •  

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top