2017-03-02 3 views
2

Ich habe eine lange Liste von Zahlen, z.Berechnen Sie die Anzahl der Werte im Vektor, die Werte in der Datenspalte überschreiten.frame

set.seed(123) 
y<-round(runif(100, 0, 200)) 

Und ich würde in Spalte y die Anzahl von Werten speichern möchte, dass jeder Wert in Spalte x eines Datenrahmens nicht überschreiten:

df <- data.frame(x=seq(0,200,20)) 

I manuell die Zahlen berechnen kann, wie folgt aus:

length(which(y>=20)) #93 values exceed 20 
length(which(y>=40)) #81 values exceed 40 

usw. Ich weiß, ich kann eine for-Schleife mit allen Werten von x verwenden, aber gibt es einen eleganteren Weg?

Ich versuchte dies:

df$y <- length(which(y>=df$x)) 

Aber das gibt eine Warnung aus und gibt mir nicht die gewünschte Ausgabe.

Der Datenrahmen sollte wie folgt aussehen:

df 
    x y 
1 0 100 
2 20 93 
3 40 81 
4 60 70 
5 80 61 
6 100 47 
7 120 40 
8 140 29 
9 160 19 
10 180 8 
11 200 0 

Antwort

2

Sie können jeden Wert von df$x gegen alle Wert von y vergleichen mit sapply

sapply(df$x, function(a) sum(y>a)) 
#[1] 99 93 81 70 61 47 40 29 18 6 0 

#Looking at your output, maybe you want 
sapply(df$x, function(a) sum(y>=a)) 
#[1] 100 93 81 70 61 47 40 29 19 8 0 

Hier ist ein weiterer Ansatz ist outer verwenden, das weise für Element erlaubt Vergleich zweier Vektoren

rowSums(outer(df$x,y, "<=")) 
#[1] 100 93 81 70 61 47 40 29 19 8 0 

noch eine weitere (von alexis_laz Kommentar)

length(y) - findInterval(df$x, sort(y), left.open = TRUE) 
# [1] 100 93 81 70 61 47 40 29 19 8 0 
+0

Als weitere Idee, die alles mit-allen Vergleichen und viele Additionen zu vermeiden, 'findInterval' für solche Aufgaben praktisch ist -' Länge (y) - findInterval (df $ x, sortieren (y), left.open = TRUE) ' –

Verwandte Themen