質問

各「日」の平均を計算したいのですが、1日の一部(時間= 12-14)です。このコードは私のために機能しますが、毎日毎日を新しいコード行として入力する必要があります。これは数百行になります。

これは簡単であるべきだと思われます。グループ化変数が同じである場合、私はこれを簡単に実行しましたが、その日のすべての値を含めたくないときにそれを行う方法がわかりません。これを行うためのより良い方法はありますか?

sapply(sap[sap$Day==165 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

sapply(sap[sap$Day==166 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)

データがどのように見えるかは次のとおりです。

Day Time    StomCond_Trunc
165 12      33.57189926
165 12.1    50.29437636
165 12.2    35.59876214
165 12.3    24.39879768
役に立ちましたか?

解決

これを試して:

aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)

他のヒント

大きなデータセットがある場合は、 data.table パッケージ。変換a data.framedata.table とても簡単です。

例:

大きな(ish)データセット

df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)

で集計を使用します data.frame

>system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean))
   user  system elapsed 
 16.255   0.377  24.263

それをaに変換します data.table

 dt <- data.table(df,key="Time")

>system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day])
   user  system elapsed 
  9.534   0.178  15.270 

マシューからの更新. 。このタイミングは、Data.table 1.8.2の新しい最適化機能により、当初回答されて以来、劇的に改善されました。

data.table 1.8.2を使用して、2つのアプローチの違いを再テストします。

df <- data.frame(Day=1:1000000,
                 Time=sample(1:14,1000000,replace=T),
                 StomCond_Trunc=rnorm(100000)*20)
system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean)) 
#   user  system elapsed 
#  10.19    0.27   10.47

dt <- data.table(df,key="Time") 
system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day]) 
#   user  system elapsed 
#   0.31    0.00    0.31 

元の方法を使用しますが、タイピングが少ない:

sapply(sap[sap$Day==165 & sap$Time %in% seq(12, 14, 0.1), ],mean)

ただし、これは元の方法よりもわずかに優れた方法です。時間の値の0.1増分に依存するため、他の答えほど柔軟ではありません。他の方法は、増分サイズを気にしないため、より汎用性が高くなります。 @Maiasauraの回答をお勧めします data.table

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top