2016-08-24 81 views
0

來表示因子水平的值平均我有以下數據幀:ř改變一個因子水平的變量值由

> 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"總是比其他地塊低得多。這是由於機械問題。我想刪除這個神器,並認爲這樣做的最好方法是對plot "3"以外的所有地塊取平均值Anemometer_reading。我想每天計算這個平均值。

我可以計算出每天的平均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 

我不知道如何去使用所產生的數據幀從plot "3"更換Anemometer_reading值。 任何人都可以指向正確的方向嗎? 謝謝

+1

你的建議是(隱式設置這些值失蹤後)稱爲「平均插補」。根據你想要對結果做什麼,這可能會引起嚴重的偏見。我建議你先對插補方法進行一些研究。 – Roland

+0

@Roland謝謝你將會考慮平均數插補 –

+1

研究[Amelia 2軟件](http://gking.harvard.edu/amelia)(包Amelia)以獲得更好的插補方法。它可以很好地處理時間序列數據。但是,如果所有來自圖3的測量結果都丟失了,那麼您不能真正推測,應該放棄重複。 – Roland

回答

1

我會關注@ roland的評論。但是,如果你關心你將如何使用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 

代替filtersummarisemutate創建計算與Plot!=3所有行的平均新列Anemometer_mean。然後用這個意思替換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

很好,這很好。很高興知道'replace()'紀念碑 –

相關問題