2010-06-09 5 views
3

Je voudrais couper un vecteur de valeurs allant de 0-70 à x nombre de catégories, et aimerais la limite supérieure de chaque catégorie. Jusqu'à présent, j'ai essayé cela en utilisant cut() et j'essaie d'extraire les limites des niveaux. J'ai une liste de niveaux, à partir de laquelle je voudrais extraire le deuxième nombre de chaque niveau. Comment puis-je extraire les valeurs entre espace et] (quel est le numéro qui m'intéresse)?comment soustraire des nombres des niveaux

Je:

> levels(bins) 
[1] "(-0.07,6.94]" "(6.94,14]" "(14,21]"  "(21,28]"  "(28,35]"  
[6] "(35,42]"  "(42,49]"  "(49,56]"  "(56,63.1]" "(63.1,70.1]" 

et je voudrais obtenir:

[1] 6.94 14 21 28 35 42 49 56 63.1 70.1 

Ou est-il une meilleure façon de calculer les limites supérieures des catégories?

Répondre

4

Cela pourrait être une solution

k <- sub("^.*\\,","", levels(bins)) 
as.numeric(substr(k,1,nchar(k)-1)) 

donne

[1] 6.94 14.00 21.00 28.00 35.00 42.00 49.00 56.00 63.10 70.10 
+0

Donc, si je comprends bien, la chaîne de modèle dit "omettre tout ce qui reste de la virgule et des espaces de coupe"? –

+0

La première commande substitue tout avant "," avec rien (""). Le second prend une sous-chaîne de longueur n-1 (pour omettre le "]" final) –

+1

en fait '\\' dans "^. * \\," est inutile, et l'approche full-regexp, bien que je ne recommande pas si vous n'êtes pas familier avec regexp, est juste: sub (". *, (. *)]", "\\ 1", niveaux (cases)) – kohske

1

Si vous souhaitez que les valeurs exactes des pauses, alors vous devriez les calculer vous-même, la cause cut limites rondes pour l'intervalle:

x <- seq(0,1,by=.023) 
levels(cut(x, 4)) 
# [1] "(-0.000989,0.247]" "(0.247,0.494]"  "(0.494,0.742]"  "(0.742,0.99]"  
levels(cut(x, 4, dig.lab=10)) 
# [1] "(-0.000989,0.2467555]" "(0.2467555,0.4945]" "(0.4945,0.7422445]" 
# [4] "(0.7422445,0.989989]" 

Vous pouvez regarder le code à cut.default comment breaks sont Compute:

if (length(breaks) == 1L) { 
    if (is.na(breaks) | breaks < 2L) 
     stop("invalid number of intervals") 
    nb <- as.integer(breaks + 1) 
    dx <- diff(rx <- range(x, na.rm = TRUE)) 
    if (dx == 0) 
     dx <- abs(rx[1L]) 
    breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, 
     length.out = nb) 
} 

donc moyen facile est de saisir ce code et mettre en fonction:

compute_breaks <- function(x, breaks) 
    if (length(breaks) == 1L) { 
     if (is.na(breaks) | breaks < 2L) 
      stop("invalid number of intervals") 
     nb <- as.integer(breaks + 1) 
     dx <- diff(rx <- range(x, na.rm = TRUE)) 
     if (dx == 0) 
      dx <- abs(rx[1L]) 
     breaks <- seq.int(rx[1L] - dx/1000, rx[2L] + dx/1000, 
      length.out = nb) 
      breaks 
    } 

Résultat est

compute_breaks(x,4) 
# [1] -0.000989 0.246755 0.494500 0.742244 0.989989