2016-08-24 2 views
0

У меня есть следующие dataframe:R меняется значение переменной одного уровня фактора для представления значения среднего уровней фактора в день

> df 
      Time_Start   Time_End Cut Plot Inlet_NH4N Outlet_NH4N Pump_reading Anemometer_reading 
1 2016-05-05 11:19:00 2016-05-06 09:30:00 1 1 0.2336795 0.30786350  79846.9   6296343 
2 2016-05-05 11:25:00 2016-05-06 09:35:00 1 3 1.0905045 0.50816024  78776.5    333116 
3 2016-05-05 11:33:00 2016-05-06 09:39:00 1 6 1.3538576 0.34866469  79585.1   8970447 
4 2016-05-05 11:37:00 2016-05-06 09:51:00 1 7 0.6862018 0.34124629  80043.1   8436546 
5 2016-05-05 11:43:00 2016-05-06 09:43:00 1 9 0.2633531 0.73813056  79227.7   9007387 
6 2016-05-05 11:48:00 2016-05-06 09:47:00 1 12 0.5934718 1.10905045  79121.5   8070785 
7 2016-05-06 09:33:00 2013-05-07 10:13:00 1 1 0.5213904 2.46791444  88800.2   7807792 
8 2016-05-06 09:38:00 2013-05-07 10:23:00 1 3 0.1684492 0.22905526  89123.0    14127 
9 2016-05-06 09:42:00 2013-05-07 10:28:00 1 6 0.4393939 0.09001782  89157.6   9844162 
10 2016-05-06 09:53:00 2013-05-07 10:34:00 1 7 0.1470588 1.03832442  88852.6   9143733 
11 2016-05-06 09:45:00 2013-05-07 10:40:00 1 9 0.1114082 0.32531194  89635.6   10122720 
12 2016-05-06 09:50:00 2013-05-07 10:43:00 1 12 0.6853832 2.51426025  89582.6   8924198 

Здесь str:

> str(df) 

'data.frame': 12 obs. of 8 variables: 
$ Time_Start  : POSIXct, format: "2016-05-05 11:19:00" "2016-05-05 11:25:00" "2016-05-05 11:33:00" ... 
$ Time_End   : POSIXct, format: "2016-05-06 09:30:00" "2016-05-06 09:35:00" "2016-05-06 09:39:00" ... 
$ Cut    : Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ... 
$ Plot    : Factor w/ 8 levels "1","3","6","7",..: 1 2 3 4 5 6 1 2 3 4 ... 
$ Inlet_NH4N  : num 0.234 1.091 1.354 0.686 0.263 ... 
$ Outlet_NH4N  : num 0.308 0.508 0.349 0.341 0.738 ... 
$ Pump_reading  : num 79847 78777 79585 80043 79228 ... 
$ Anemometer_reading: int 6296343 333116 8970447 8436546 9007387 8070785 7807792 14127 9844162 9143733 ... 

Это небольшой сегмент более крупного набора данных. У меня проблема с этими данными в том, что Anemometer_reading для plot "3" всегда намного ниже, чем для других графиков. Это связано с механической проблемой. Я хочу удалить этот артефакт и подумать, что лучший способ сделать это - взять в среднем Anemometer_reading для всех сюжетов с plot "3". Я хочу рассчитать это среднее значение ежедневно.

Я могу рассчитать суточную Anemometer_reading среднем, за исключением plot "3", как это:

library(dplyr) 
> df_avg <- df %>% filter(Plot != "3") %>% group_by(as.Date(Time_End)) %>% summarise(Anemometer_mean = mean(Anemometer_reading)) 
> df_avg 
Source: local data frame [2 x 2] 


    as.Date(Time_End) Anemometer_mean 
      <date>   <dbl> 
1  2013-05-07   9168521 
2  2016-05-06   8156302 

Я не уверен, как идти об использовании полученной dataframe заменить Anemometer_reading значения из plot "3". Может ли кто-нибудь указать мне в правильном направлении, пожалуйста? Thanks

+1

Что вы предлагаете (после неявного определения этих значений), что называется «условным вменением». В зависимости от того, что вы хотите сделать с результатом, это может привести к серьезному уклону. Я предлагаю вам сначала провести исследование в отношении методов вменения. – Roland

+0

@Roland благодарит вас за то, что вы считаете средним вменением. –

+1

Посмотрите на [программное обеспечение Amelia 2] (http://gking.harvard.edu/amelia) (пакет Amelia) для лучших методов вменения. Он может прекрасно справляться с данными временных рядов. Но если все измерения из графика 3 отсутствуют, вы не можете действительно приписывать и, вероятно, должны отказаться от репликации. – Roland

ответ

1

Я буду следить за комментарием Роланда. Тем не менее, если вы заботитесь о том, как вы будете использовать dplyr делать то, что вы просили:

result <- df %>% group_by(as.Date(Time_End)) %>% 
       mutate(Anemometer_mean = mean(Anemometer_reading[Plot != "3"])) %>% 
       mutate(Anemometer_reading = replace(Anemometer_reading, Plot == "3", first(Anemometer_mean))) %>% 
       ungroup() %>% select(-`as.Date(Time_End)`, -Anemometer_mean) 
print(result) 
## A tibble: 12 x 8 
##   Time_Start   Time_End Cut Plot Inlet_NH4N Outlet_NH4N Pump_reading Anemometer_reading 
##    <fctr>    <fctr> <int> <int>  <dbl>  <dbl>  <dbl>    <dbl> 
##1 2016-05-05 11:19:00 2016-05-06 09:30:00  1  1 0.2336795 0.30786350  79846.9   6296343 
##2 2016-05-05 11:25:00 2016-05-06 09:35:00  1  3 1.0905045 0.50816024  78776.5   8156302 
##3 2016-05-05 11:33:00 2016-05-06 09:39:00  1  6 1.3538576 0.34866469  79585.1   8970447 
##4 2016-05-05 11:37:00 2016-05-06 09:51:00  1  7 0.6862018 0.34124629  80043.1   8436546 
##5 2016-05-05 11:43:00 2016-05-06 09:43:00  1  9 0.2633531 0.73813056  79227.7   9007387 
##6 2016-05-05 11:48:00 2016-05-06 09:47:00  1 12 0.5934718 1.10905045  79121.5   8070785 
##7 2016-05-06 09:33:00 2013-05-07 10:13:00  1  1 0.5213904 2.46791444  88800.2   7807792 
##8 2016-05-06 09:38:00 2013-05-07 10:23:00  1  3 0.1684492 0.22905526  89123.0   9168521 
##9 2016-05-06 09:42:00 2013-05-07 10:28:00  1  6 0.4393939 0.09001782  89157.6   9844162 
##10 2016-05-06 09:53:00 2013-05-07 10:34:00  1  7 0.1470588 1.03832442  88852.6   9143733 
##11 2016-05-06 09:45:00 2013-05-07 10:40:00  1  9 0.1114082 0.32531194  89635.6   10122720 
##12 2016-05-06 09:50:00 2013-05-07 10:43:00  1 12 0.6853832 2.51426025  89582.6   8924198 

Вместо того, чтобы filter и summarise, mutate создать новый столбец Anemometer_mean, который вычисляет среднее значение со всеми строками для Plot!=3. Затем замените Anemometer_read на эти строки Plot==3 с этим значением.

В самом деле, вы можете сделать все это только один mutate:

result <- df %>% group_by(as.Date(Time_End)) %>% 
       mutate(Anemometer_reading = replace(Anemometer_reading, Plot == "3", mean(Anemometer_reading[Plot != "3"]))) %>% 
       ungroup() %>% select(-`as.Date(Time_End)`) 

Надеется, что это помогает.

+0

отлично, это хорошо работает. Приятно знать о «замене()» агитации –

Смежные вопросы