Агрегирование данных со значениями NA на основе сайта - PullRequest
0 голосов
/ 03 октября 2018

Я использую набор данных EPA NLA, чтобы найти среднюю температуру в эпилиминии для некоторых данных по озеру.Набор данных выглядит следующим образом:

SITE  DEPTH   METALIMNION   TEMP FIELD
1      0.0       NA            25.6
1      0.5       NA            25.1
1      0.8       T             24.9
1      1.0       NA            24.1  
1      2.0       B             23.0
2      0.0       NA            29.0
2      0.5       T             28.0

«T» указывает на конец эпилиминия, и я хочу усреднить все соответствующие значения температуры, включая и выше «T» для каждого участка.Я понятия не имею, с чего начать.(«B» не имеет отношения к этому вопросу).Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Предполагая, что для каждого значения сайта есть только один 'T', используя пакет dplyr:

library(dplyr)

data.frame(SITE=c(1,1,1,1,1,2,2),TEMP=c(25.6,25.1,24.9,24.1,23.0,29.0,28.0)) %>%
    group_by(SITE) %>%
    summarise(meanTemp=mean(TEMP))

Результат:

# A tibble: 2 x 2
   SITE meanTemp
  <dbl>    <dbl>
1     1     24.5
2     2     28.5
0 голосов
/ 03 октября 2018

С помощью базы R вы можете сделать это следующим образом.

Я дважды использую ave, чтобы впервые определить, где столбец METALIMNION имеет "T", по группе SITE.Это вектор g.

Второе среднее METALIMNION на SITE и этот вектор g.

g <- with(NLA, ave(as.character(METALIMNION), SITE, 
              FUN = function(x) {
                x[is.na(x)] <- ""
                rev(cumsum(rev(x) == "T"))
                }))
NLA$AVG <- ave(NLA$TEMP.FIELD, NLA$SITE, g)

NLA
#  SITE DEPTH METALIMNION TEMP.FIELD   AVG
#1    1   0.0        <NA>       25.6 25.20
#2    1   0.5        <NA>       25.1 25.20
#3    1   0.8           T       24.9 25.20
#4    1   1.0        <NA>       24.1 23.55
#5    1   2.0           B       23.0 23.55
#6    2   0.0        <NA>       29.0 28.50
#7    2   0.5           T       28.0 28.50
...