2016-07-06 8 views
2

Jetzt möchte ich eine Spalte numpoints für die Anzahl der Punkte innerhalb einer Gruppe generieren, die außerhalb von -2 und +5 des Mittelwerts liegen.Anzahl der Punkte innerhalb einer Gruppe außerhalb eines Schwellenwerts suchen

mutated <- mtcars %>% group_by(cyl) %>% 
mutate(numpoints = length(which(.$mpg < (.$meanmpg - 2) | .$mpg > (.$meanmpg + 5))) ) 

würde beispielsweise I 6 in der Spalte NumPoints sieht für die "4 cyl Gruppe" und 1 für die "6 cyl Gruppe". (Weniger als Mittelwert mpg - 2 oder größer als mpg + 5 bedeuten)

irgendwelche Ideen? Ich habe auch Filter ausprobiert, kann aber keine Möglichkeit finden, alle meine Daten nach dem Filter zu behalten.

Antwort

2

Jetzt möchte ich eine Spalte numpoints für die Anzahl der Punkte innerhalb einer Gruppe, die außerhalb von -2 und + 5 des Mittelwerts fallen.

Ich würde versuchen,

library(dplyr) 
mtcars %>% 
    group_by(cyl) %>% 
    mutate(numpoints = sum(!between(mpg, meanmpg-2, meanmpg+5))) 
# Source: local data frame [32 x 13] 
# Groups: cyl [3] 
# 
#  mpg cyl disp hp drat wt qsec vs am gear carb meanmpg numpoints 
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <int> 
# 1 21.0  6 160.0 110 3.90 2.620 16.46  0  1  4  4 20.09062   1 
# 2 21.0  6 160.0 110 3.90 2.875 17.02  0  1  4  4 20.09062   1 
# 3 22.8  4 108.0 93 3.85 2.320 18.61  1  1  4  1 20.09062   6 
# 4 21.4  6 258.0 110 3.08 3.215 19.44  1  0  3  1 20.09062   1 
# 5 18.7  8 360.0 175 3.15 3.440 17.02  0  0  3  2 20.09062  12 
# 6 18.1  6 225.0 105 2.76 3.460 20.22  1  0  3  1 20.09062   1 
# 7 14.3  8 360.0 245 3.21 3.570 15.84  0  0  3  4 20.09062  12 
# 8 24.4  4 146.7 62 3.69 3.190 20.00  1  0  4  2 20.09062   6 
# 9 22.8  4 140.8 95 3.92 3.150 22.90  1  0  4  2 20.09062   6 
# 10 19.2  6 167.6 123 3.92 3.440 18.30  1  0  4  4 20.09062   1 
# .. ... ... ... ... ... ... ... ... ... ... ...  ...  ... 
1

R Basis ist ziemlich einfach:

# get data 
data(mtcars) 

# get mean 
meanmpg <- mean(mtcars$mpg) 

# calculate min/max threshold 
mtcars$outsidethreshold <- (mtcars$mpg - meanmpg) > 5 | (mtcars$mpg - meanmpg) < -2 

# get sum by group with ave 
mtcars$numpoints <- ave(mtcars$outsidethreshold,mtcars$cyl,FUN = sum)