2016-04-22 9 views
-4

私はRで非常に新しいです。私は12年間(6574行、6col、いくつかのNA)の温度とPPの毎日の観測を持っています。たとえば、2001年1月1日から10日までの平均値、次に11-20日間の平均値、21から31日間の平均値などを計算したいとします。n番目の行ごとに毎日の情報の平均列

また、2月には28日または29日(うるう年)があることがあるため、問題が発生します。

これは

 Año Mes Dia PT101 TM102 TM103  
1 1998 1 1 6.0 15.6 3.4 
2 1998 1 2 8.0 14.4 3.2 
3 1998 1 3 8.6 13.8 4.4 
4 1998 1 4 5.6 14.6 4.6 
5 1998 1 5 0.4 17.4 3.6 
6 1998 1 6 3.4 17.4 4.4 
7 1998 1 7 9.2 14.6 3.2 
8 1998 1 8 2.2 16.8 2.8 
9 1998 1 9 8.6 18.4 4.4 
10 1998 1 10 6.2 15.0 3.6 
. . . . .  .  . 
+1

ようこそ。あなたのコードの画像を投稿するのではなく、画像ではなくテキストとしてコードを置くと、人々はそれを感謝します。これにより、より簡単に調べることができます。 – lmo

+0

あなたのアドバイスをありがとうございます。@lmo – Guisseppe

+0

1日目から10日目までは1、次に11から20は2、> 20は3という新しい列を作成するのが簡単な方法でしょう。 (TM102〜Mes + x、data = huancavelica、mean) 'のようなものを試してみてください。おそらくより良い方法がありますが、これは簡単です。 '?aggregate'や[this one](http://stackoverflow.com/questions/21982987/mean-per-group-in-a-data-frame)のような質問も参照してください。 – Laterow

答えて

1

を試すことができますread.table

# READ CSV 
setwd ("C:\\Users\\GVASQUEZ\\Documents\\ESTUDIO_PAMPAS\\R_sheet") 

huancavelica<-read.table("huancavelica.csv",header = TRUE, sep = ",", 
         dec = ".", fileEncoding = "latin1", nrows = 6574) 

とこれは私のCSVの出力であり、私は私のファイルはCSVで開く方法ですかなり試したことがあるデータ設定が正しく機能するはずです:

# add 0 in front of single digit month variable to account for 1 and 10 sorting 
huancavelica$MesChar <- ifelse(nchar(huancavelica$Mes)==1, 
        paste0("0",huancavelica$Mes), as.character(huancavelica$Mes)) 

# get time of month ID 
huancavelica$timeMonth <- ifelse(huancavelica$Dia < 11, 1, 
          ifelse(huancavelica$Dia > 20, 3, 2) 
# get final ID 
huancavelica$ID <- paste(huancavelica$Año, huancavelica$MesChar, huancavelica$timeMonth, sep=".") 
# average stat 
huancavelica$myStat <- ave(huancavelica$PT101, huancavelica$ID, FUN=mean, na.rm=T) 
+0

ありがとうございました。それは働いている。 1つの最後の質問、私は、平均の代わりに合計したい場合は、 "私は使用することができる要素のレベルの組み合わせ以上のグループの合計"と別の機能があります。 – Guisseppe

+0

ありがとう、それは完全に動作します。 – Guisseppe

1

を提出我々が

library(data.table) 
setDT(df1)[, Grp := (Dia - 1)%/%10+1, by = .(Ano, Mes) 
     ][Grp>3, Grp := 3][,lapply(.SD, mean, na.rm=TRUE), by = .(Ano, Mes, Grp)] 
0

これは少し複雑ですが、毎月を3分の1に減らし、3分の1の平均を取得できます。たとえば、次のようにStackOverflowに

library(dplyr) 
library(lubridate) 

# Fake data 
set.seed(10) 
df = data.frame(date=seq(as.Date("2015-01-01"), as.Date("2015-12-31"), by="1 day"), 
       value=rnorm(365)) 

# Cut months into thirds 
df = df %>% 
    mutate(mon_yr = paste0(month(date, label=TRUE, abbr=TRUE) , " ", year(date))) %>% 
    group_by(mon_yr) %>% 
    mutate(cutMonth = cut(day(date), 
         breaks=c(0, round(1/3*n()), round(2/3*n()), n()), 
         labels=c("1st third","2nd third","3rd third")), 
     cutMonth = paste0(mon_yr, ", ", cutMonth)) %>% 
    ungroup %>% 
    mutate(cutMonth = factor(cutMonth, levels=unique(cutMonth))) 
  date  value   cutMonth 
    1 2015-01-01 0.01874617 Jan 2015, 1st third 
    2 2015-01-02 -0.18425254 Jan 2015, 1st third 
    3 2015-01-03 -1.37133055 Jan 2015, 1st third 
... 
363 2015-12-29 -1.3996571 Dec 2015, 3rd third 
364 2015-12-30 -1.2877952 Dec 2015, 3rd third 
365 2015-12-31 -0.9684155 Dec 2015, 3rd third 
# Summarise to get average value for each 1/3 of a month 
df.summary = df %>% 
    group_by(cutMonth) %>% 
    summarise(average.value = mean(value)) 
   cutMonth average.value 
1 Jan 2015, 1st third -0.49065685 
2 Jan 2015, 2nd third 0.28178222 
3 Jan 2015, 3rd third -1.03870698 
4 Feb 2015, 1st third -0.45700203 
5 Feb 2015, 2nd third -0.07577199 
6 Feb 2015, 3rd third 0.33860882 
7 Mar 2015, 1st third 0.12067388 
... 
関連する問題