2016-11-17 5 views
0

Einrichtung I 1,000,000 Beobachtungen aus dem folgende normalen Mischungsmodell und Ist die Beobachtungen, so dass jedes der 10,000 sind hat eine gleiche Anzahl von Beobachtungen Probe (d.h. 100). Dies erzeugt einen Faktor für jeden Behälter in der Form (a,b], wobei a und b Nummern sind.Erhalten Endpunkte von Intervall, die variable Faktor

#Random sample 
set.seed(1234) 
X = ks::rnorm.mixt(n=1000000,mus=c(0.2,0.8),sigmas=c(0.04,0.01),props=c(0.95,0.05)) 

#Bins based on random sample with ~100 observations in each bins 
bins = ggplot2::cut_number(X,10000) 

dat = data.frame(X,bins) 

Frage Ich möchte die Zahlen (a,b]a und b vom Faktor extrahieren. Hier ist, was die Behälter wie folgt aussehen:

> head(table(bins)) 
bins 
[0.00501617,0.0518875] (0.0518875,0.0594831] (0.0594831,0.0640679] 
        100     100     100 
(0.0640679,0.0670062] (0.0670062,0.0694194] (0.0694194,0.0717924] 
        100     100     100 
> tail(table(bins),20) 
bins 
(0.817766,0.818032] (0.818032,0.8183] (0.8183,0.818544] (0.818544,0.818879] 
       100     100     100     100 
(0.818879,0.819112] (0.819112,0.819394] (0.819394,0.819664] (0.819664,0.819979] 
       100     100     100     100 
(0.819979,0.820328] (0.820328,0.820727] (0.820727,0.821118] (0.821118,0.82158] 
       100     100     100     100 
(0.82158,0.822109] (0.822109,0.822646] (0.822646,0.823253] (0.823253,0.82408] 
       100     100     100     100 
(0.82408,0.825026] (0.825026,0.826417] (0.826417,0.828651] (0.828651,0.84424] 
       100     100     100     100 

Wie Sie sehen können, die Zahlen in den Faktoren nicht immer die gleiche Anzahl von Ziffern haben, und sie können von 0'en (z (0.0518875,0.0594831]) vorangestellt werden.

I

endpts=na.omit(as.numeric(unlist(strsplit(as.character(unlist(bins)),"[^0-9]+")))) 

Für die oben ist ((0.0518875,0.0594831]) nur mit dem numerischen Teil zu extrahieren zunächst versucht, würde dieses Verfahren Ausgabe 518875 594831, sondern weil die nachgestellten Nullen weg sind, könnte es zu mehrere abgebildet wird Werte (zB 0.518875 0.594831). Außerdem gibt es Fächer, in denen eine oder beide Nummern eine unterschiedliche Anzahl von Ziffern haben (z. B. (0.818032,0.8183]). Dieser Mangel an Einheitlichkeit in der Ausgabe gibt mir Probleme, wenn ich versuche, die Endpunkte zu bekommen. Letztendlich möchte ich die linken und rechten Endpunkte bekommen. Irgendwelche Vorschläge?

BEARBEITEN Ich schaute auch in den Code für ggplot2::cut_number, die die Funktion verwendet. Die Standardeingabe in für die Anzahl der Ziffern ist dig.lab=3, aber dies scheint sich nicht in der obigen Ausgabe widerzuspiegeln.

+0

Ihr Code hätte eine bessere Chance auf Erfolg, wenn Sie die Dezimalpunkte beibehalten. –

Antwort

2

Etwas in diesem leicht getestet Ansatz:

unique(as.numeric( unlist( 
       strsplit(gsub("[][(]" , "", levels(bins)[1:5]) , ",")))) 

I "verschachtelte R Code gelesen von der inside-out" gelernt haben. Diese erste (1) entfernt die Flankierung "(", "[" und "]" unter Verwendung eines Zeichenklassenmusters, dann (2) teilt sich in Kommas auf, (3) "vektorisiert" die Listenstruktur mit unlist, (4) konvertiert dann .

unique(     #  (5) 
    as.numeric(     #  (4) 
     unlist(      #  (3) 
      strsplit(     #  (2) 
       gsub("[][(]" , "", levels(bins)[1:5]) , ",") # (1) 
     ))) 

auf Ihrem Beispiel getestet Dies wurde und dies die ersten 5 Stufen für ein kleineres Beispiel erzeugt mit: auf numerische und Duplikate entfernt schließlich (5) Dies zeigt es Zeilenumbrüche zur Formatierung mit

unique(as.numeric( unlist(strsplit(gsub("[][(]" , "", levels(bins)[1:5]) , ",")))) 
[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940 

Ich setze das Wort "vectorizes" in Anführungszeichen, weil es nicht wirklich die Bedeutung dieses Wortes in der R-Terminologie ist, wo es sich auf Operationen bezieht, die einen Vektor gleicher Länge wie seinen zurückgeben Eingabe.

Hier sind die Ergebnisse meines Vorschlags, den Dezimalpunkt (Punkt) in den Elementen nicht als Splitting-Kriterien und caison mit dem, was mein Code geliefert hätte, zu halten. Sie waren sich nicht sicher, ob Sie nur die eindeutigen Werte oder die Werte für jeden Artikel haben wollten:

endpts= na.omit(as.numeric(unlist(strsplit(as.character(unlist(bins)),"[^0-9.]+")))) 

head(endpts) 
#[1] 0.216698 0.216709 0.243665 0.243682 0.201100 0.201114 
end2 <- unique(as.numeric( unlist(strsplit(gsub("[][(]" , "", levels(bins)) , ",")))) 
head(end2) 
#[1] 0.00501617 0.05188750 0.05948310 0.06406790 0.06700620 0.06941940 
length(endpts) 
#[1] 2000000 
length(end2) 
#[1] 10001 
2

Ich denke, dass Sie die Struktur (a, b] nutzen können. Ich habe nicht versucht, auf die realen Daten aber hier ist mein Versuch:

s <- c("(0.0518875,0.0594831]", "0.818032,0.8183]") 
lapply(strsplit(s, ","), function(x) gsub("\\(|]", "", x)) 

[[1]] 
[1] "0.0518875" "0.0594831" 

[[2]] 
[1] "0.818032" "0.8183" 

Sie können es durch as.numeric Nummer ändern, wenn Sie die Nummer möchten.

+0

Ich glaube nicht, dass das 'lapply' notwendig ist. –

Verwandte Themen