2015-04-21 11 views
5

Mam ramki danych skonfigurować tak:Obliczanie średnio w ramce danych na podstawie lokalizacji w oddzielnych kolumnach

N1 <- c(1,2,4,3,2,3,4,5,4,3,4,5,4,5,6,8,9) 
Start <- c("","Start","","","","","","","Start","","","","Start","","","","") 
Stop <- c("","","","","Stop","","","","","","Stop","","","","Stop","","") 

Z N1 bycia moich danych interesów. Chciałbym obliczyć średnią z ciągu liczb na podstawie lokalizacji "Start" i "Stop" w dwóch kolejnych kolumnach.

Łańcuchy zdefiniowane przez "start" i "stop" będzie wyglądać tak:

2,4,3,2 
4,3,4 
4,5,6 

więc mój wynik końcowy powinien być 3 sposoby:

2.75,3.6,5 

Odpowiedz

5

można spróbować:

mapply(function(start, stop){ 
      mean(N1[start:stop]) 
     }, 
     start=which(Start!=""), 
     stop=which(Stop!="")) 

#[1] 2.750000 3.666667 5.000000 
2

Możesz również wypróbować: rollapply

library(zoo) 
x <- sort(c(which(Stop != ""), which(Start != ""))) # indices of Start and Stop 
rollapply(x, 2, FUN = function(y) mean(N1[y[1]:y[2]]), by=2) 
[1] 2.750000 3.666667 5.000000 
4
library(data.table) # need latest 1.9.5+ 

# set up data to have all 1's column for the period we're interested in and 0 otherwise 
d = data.table(N1, event = cumsum((Start != "") - c(0, head(Stop != "", -1)))) 

d[, mean(N1), by = .(event, rleid(event))][event == 1, V1] 
#[1] 2.750000 3.666667 5.000000 

# or equivalently 
d[, .(event[1], mean(N1)), by = rleid(event)][V1 == 1, V2] 
Powiązane problemy