2016-08-04 10 views
0

nehme ich die folgende Datenrahmen habenSplit Datenrahmen in die Behälter auf einem anderen Vektor-basierte

x <- c(12,30,45,100,150,305,2,46,10,221) 
x2 <- letters[1:10] 
df <- data.frame(x,x2) 
df <- df[with(df, order(x)), ] 
    x x2 
7 2 g 
9 10 i 
1 12 a 
2 30 b 
3 45 c 
8 46 h 
4 100 d 
5 150 e 
10 221 j 
6 305 f 

Und ich möchte diese in Gruppen aufgeteilt auf einem anderen Vektor-basierte,

v <- seq(0, 500, 50) 

Grundsätzlich möchte ich um jede Zeile basierend auf Spalte x und wie sie mit v übereinstimmt zu trennen (also zum Beispiel x < = ein Element in v) - die Position/der Index dieses Elements in v wird dann verwendet, um eine Gruppe für diese Zeile zuzuweisen. Die resultierende Tabelle sollte in etwa wie folgt aussehen:

 x x2 group 
7 2 g g1 
9 10 i g1 
1 12 a g1 
2 30 b g1 
3 45 c g1 
8 46 h g2 
4 100 d g3 
5 150 e g4 
10 221 j g4 
6 305 f g6 

ich Schleife durch jede Zeile könnte versuchen und versuchen, es zu v entsprechen, aber ich bin immer noch verwirren, wie könnte ich leicht erkennen, wo das Spiel x < = Element v tritt auf, so dass ich ihm eine Gruppen-ID zuweisen kann. Vielen Dank.

Antwort

3

können Sie cut verwenden df$x durch die Werte von v zu brechen:

df$group <- as.numeric(cut(df$x, breaks = v)) 
df$group <- paste0('g', df$group) 

cut gibt einen Faktor, so dass Sie as.numeric verwenden können, um gerade herausziehen, welche numerische bucket der Wert df$x in auf v Basis fällt .

+0

Alles in einer Zeile - 'Schnitt (df $ x, v, paste0 (" g ", seq_along (v) [- Länge (v)]))' – thelatemail

+0

clever, danke, das war sehr hilfreich – Ahdee