2016-04-12 14 views
2

Die Dokumentation der cut Funktion „eine Möglichkeit, die Haltepunkte zu extrahieren“ gibtdie Haltepunkte von Schnitt

aaa <- c(1,2,3,4,5,2,3,4,5,6,7) 
labs <- levels(cut(aaa, 3)) 
cbind(lower = as.numeric(sub("\\((.+),.*", "\\1", labs)), 
     upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labs))) 

#  lower upper 
# [1,] 0.994 3.00 
# [2,] 3.000 5.00 
# [3,] 5.000 7.01 

Gibt es eine andere - build-in - Art und Weise die Haltepunkte zu extrahieren?

+0

Sie können die Regex ein wenig vereinfachen: 'as.numeric (sub ('. (. +),. +', '\\ 1', Labs)); as.numeric (sub ('. +, (. +).', '\\ 1', Labs)) ' – alistaire

Antwort

3

1) read.table Ich glaube nicht, dass es irgendetwas direkt dafür gedacht ist, aber das ist kürzer:

read.table(text = gsub("[^.0-9]", " ", labs), col.names = c("lower", "upper")) 

gibt diesen data.frame:

lower upper 
1 0.994 3.00 
2 3.000 5.00 
3 5.000 7.01 

2) gsubfn :: strapply und das ist eine andere Möglichkeit:

library(gsubfn) 

strapply(labs, "[.0-9]+", as.numeric, simplify = rbind) 

gibt diese Matrix:

 [,1] [,2] 
[1,] 0.994 3.00 
[2,] 3.000 5.00 
[3,] 5.000 7.01 

3) gsubfn :: read.pattern und eine andere:

library(gsubfn) 

read.pattern(text = labs, pattern = ".(.+),(.+).", col.names = c("lower", "upper")) 

geben:

lower upper 
1 0.994 3.00 
2 3.000 5.00 
3 5.000 7.01 
0

Hier ist eine Lösung mit strsplit():

sapply(strsplit(labs, "\\(|,|]"), function(x) as.numeric(x[-1])) 
#  [,1] [,2] [,3] 
# [1,] 0.994 3 5.00 
# [2,] 3.000 5 7.01