R:グループのサブセットの平均を計算します
-
27-10-2019 - |
質問
各「日」の平均を計算したいのですが、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.frame
に data.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
所属していません StackOverflow