2016-12-06 8 views
-1

meine Daten Given (siehe unten), ich bin mit mehrere"Länge" + "die" Aussagen (siehe unten) meine Daten zu erkunden.Automatisieren eine Routine in R

Q1. Gibt es einen effizienten Code zu automatisieren dies anstatt diese vielen Zeilen Code zu verwenden?

Q2. Kann ich die Antworten aus allen "length" + "which" Anweisungen in einer Tabelle zusammenfassen? (Zum Beispiel für die ersten„Länge“ + „die“ Erklärung wo die Antwort 9, eine Tabelle „1. Quadranten“ und neben oder unterhalb sagen kann)?

Hier ist meine Daten und die „Länge“ + „die“ Aussagen die ich geschaffen habe:

x <- c(2,1,5,4,5,8,6,6,4,1,2,2,2,5,9,5,4,3,2,3,1,3,1,7,3,2,2,9,7,7,9,8,8,6,4,6,7,2,1,4,3,9) 
y <- c(1,2,2,8,7,4,6,7,5,5,2,9,3,9,1,5,7,1,8,6,8,4,9,2,7,5,7,6,3,8,3,3,7,8,3,4,4,4,3,6,5,4) 

## HERE is my "length" + "which" statements: 

length(x[which(x < 5 & y <5)]) ## 1st quadrant datapoints (Left Bottom) 
length(x[which(x < 5 & y >5)]) ## 2rd quadrant " 
length(x[which(x > 5 & y >5)]) ## 3rd quadrant " 
length(x[which(x > 5 & y <5)]) ## 4rd quadrant datapoints (Right Bottom) 

length(x[which(x < 5)]) ## 1st left half 
length(x[which(x > 5)]) ## 2nd right half 
length(x[which(y < 5)]) ## 1st Bottom half 
length(x[which(y > 5)]) ## 2nd Top half 

length(x[which(x==5)]) ## Balanced Scope 
length(x[which(y==5)]) ## Balanced Technicality 
length(x[which(x==5 & y==5)]) ## Equal Scope and Technicality 

length(x[which(y==5)]) ## How many of Xs have a Y of 5 
length(y[which(x==5)]) ## How many of Ys have a X of 5 
+3

Check-out '? cut' und'? table' tun ... –

+0

Sie brauchen nicht zu einem der 'which()' Aussagen hier. Wie [von H. Wickham:] (http://adv-r.had.co.nz/Subsetting.html) "Wenn man zuerst Subsetting lernt, ist es ein häufiger Fehler, stattdessen' x [which (y)] '' zu verwenden von 'x [y]'. " – RHertel

+0

@RHertel das hängt davon ab, wie Sie mit NA-Werten umgehen wollen. Wenn 'x [y]' und 'y' einen NA-Wert enthalten, fügen Sie an dieser Position einen NA-Wert ein. Wenn Sie das vermeiden wollen, verwenden Sie entweder 'isTRUE' oder 'which'. Ich verwende auch "which", um eine kleine Teilmenge zu speichern und viel Speicher zu sparen, verglichen mit einem logischen Vektor voller Länge, der dieselbe Teilmenge definiert. –

Antwort

1

Wenn Sie wollen einfach nur einen schönen Tisch schaffen mit Ihrer eigenen Beschreibung, dann ist die Der beste Weg ist, es einfach mit "vielen" Zeilen zu machen.

names=c("1st quadrant", "2rd quadrant", "3rd quadrant", "...") 
numbers=c(length(x[x < 5 & y <5]), length(x[x < 5 & y >5]), length(x[x > 5 & y >5]), 12345) 

new_table=data.frame(names,numbers) 
1

Zunächst möchte ich zu anmerken, dass length(x[which(logical_vector)]) ist nur sum(logical_vector) wenn diese Länge des Vektors nicht mehr als die Länge des x ist (in Ihrem Fall sind sie immer die gleiche Länge).

Aber ich werde einen anderen Ansatz vorschlagen als logische Vektoren zu summieren. x und y-Koordinaten der Punkte in einer Ebene darstellen, so wäre es natürlich, sie in ein Datenrahmen, wie folgt gebunden zu haben:

d <- data.frame(x, y) 

Das einzige, was über x und y die wirklich zählt, ist, was die Zeichen sind von (x - 5) und (y - 5) Ausdrücke (Ich werde es weiter veranschaulichen). Lassen Sie uns sie berechnen.

library(dplyr) 
d <- mutate(d, sx = sign(x - 5), sy = sign(y - 5)) 
head(d) 

    x y sx sy 
1 2 1 -1 -1 
2 1 2 -1 -1 
3 5 2 0 -1 
4 4 8 -1 1 
5 5 7 0 1 
6 8 4 1 -1 

Also, zu erklären: wenn ein Punkt, z.B. hat sx = -1 und sy = -1 es bedeutet, dass für diesen Punkt x < 5 und y < 5 so können wir den Quadranten nur mit sx und sy ermitteln.

Nun müssen wir eine Art Wörterbuch erstellen, das uns den sx und sy den Quadranten angibt.Es ist ganz einfach:

library(tibble) 
quadrant <- tribble(
    ~sx, ~sy, ~quadrant, 
    -1, -1,   1, 
    -1, 1,   2, 
     1, 1,   3, 
     1, -1,   4 
) 

Dann können wir einfach d mit ihr verschmelzen die quadrant Variable zu erhalten (einige Punkte NAs haben, aber das ist kein Problem):

d <- merge(d, quadrant, all.x = T) 

Und schließlich die Zusammenfassung von Quadranten bekommen wir

count(d, quadrant) 

# A tibble: 5 × 2 
    quadrant  n 
    <dbl> <int> 
1  1  9 
2  2 10 
3  3  6 
4  4  9 
5  NA  8 
Verwandte Themen