2016-06-17 7 views
1

Ich habe dieses "d" Datenrahmen, der 2 Gruppen hat. Im wirklichen Leben habe ich 20 Gruppen.korrekte Weise Spalten zu Datenrahmen ohne Schleife hinzufügen

d= data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000)) 
d 
     group value 
    1  A  1 
    2  A  2 
    3  A  3 
    4  A  4 
    5  A  5 
    6  A  6 
    7  A  7 
    8  A  8 
    9  A  9 
    10  A 10 
    11  B 101 
    12  B 102 
    13  B 103 
    14  B 104 
    15  B 105 
    16  B 106 
    17  B 107 
    18  B 108 
    19  B 109 
    20  B 110 
    21  A 10000 

Ich mag würde 2 Spalten hinzufügen, „oben“ und „unten“, das bei der GROUP unter dem Niveau berechnet.

d= data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000)) 
d 
d$upper = ifelse(d$group=="A", quantile(d$value[d$group=="A"])[4]+ 2.5*IQR(d$value[d$group=="A"]), quantile(d$value[d$group=="B"])[4]+ 2.5*IQR(d$value[d$group=="B"]) ) 
d$lower = ifelse(d$group=="A", quantile(d$value[d$group=="A"])[4]- 2.5*IQR(d$value[d$group=="A"]), quantile(d$value[d$group=="B"])[4]- 2.5*IQR(d$value[d$group=="B"]) ) 


    group value upper lower 
1  A  1 21 -4.0 
2  A  2 21 -4.0 
3  A  3 21 -4.0 
4  A  4 21 -4.0 
5  A  5 21 -4.0 
6  A  6 21 -4.0 
7  A  7 21 -4.0 
8  A  8 21 -4.0 
9  A  9 21 -4.0 
10  A 10 21 -4.0 
11  B 101 119 96.5 
12  B 102 119 96.5 
13  B 103 119 96.5 
14  B 104 119 96.5 
15  B 105 119 96.5 
16  B 106 119 96.5 
17  B 107 119 96.5 
18  B 108 119 96.5 
19  B 109 119 96.5 
20  B 110 119 96.5 
21  A 10000 21 -4.0 

Aber wenn ich 20 oder 30 Spalten was ist der beste Weg, um diese Spalten hinzufügen, ohne eine Schleife zu tun: Da es nur zwei Gruppen sind, kann ich die Spalten manuell wie folgt hinzufügen?

+0

Sie sollten 'lapply' verwenden. Es ist immer noch eine Schleife, aber ist in c geschrieben. Außerdem erstellt es nicht wiederholt Kopien des data.frame, nur einmal am Ende. 'mydf [] <- lapply (listOfStuff, function)' Wenn Sie möchten, könnten Sie eine Liste von Funktionen im ersten Argument haben. – lmo

+0

hängt davon ab, wie Sie die Spalten erstellen müssen. hast du 20-30 Variationen der oberen/unteren Spalten oder sind das ganz anders? – rawr

+0

nein die Berechnung ändert sich nicht. Was sich ändert, ist, dass es spezifisch für die Gruppe ist – user3022875

Antwort

1

Groupwise Operationen leicht durchgeführt werden können dplyr ‚s group_by Funktion:

library(dplyr) 
d <- data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000)) 
d %>% 
    group_by(group) %>% 
    mutate(upper=quantile(value, 0.75) + 2.5*IQR(value), 
      lower=quantile(value, 0.75) - 2.5*IQR(value)) 

Dieser teilt den Datenrahmen durch die‚Gruppe‘variable und berechnet dann die‚oberen‘und‚unteren‘für jeweils separat Spalten Gruppe.

Verwandte Themen