マストからの気象データを含む長いデータ フレームがあります。これには、異なる高さ ( )data$value
で異なるパラメータ (風速、風向、気温など) で同時に取得された観測 ( ) が含まれています。data$param
data$z
このデータを で効率的にスライスし$time
、収集したすべてのデータに関数を適用しようとしています。通常、関数は一度に 1 つの関数に適用され$param
ます (つまり、気温とは異なる関数を風速に適用します)。
現在のアプローチ
私の現在の方法は、とを使用することdata.frame
ですddply
。
すべての風速データを取得したい場合は、次を実行します。
# find good data ----
df <- data[((data$param == "wind speed") &
!is.na(data$value)),]
df
次に、次を使用して関数を実行しddply()
ます。
df.tav <- ddply(df,
.(time),
function(x) {
y <-data.frame(V1 = sum(x$value) + sum(x$z),
V2 = sum(x$value) / sum(x$z))
return(y)
})
通常、V1 と V2 は他の関数への呼び出しです。これらはほんの一例です。ただし、同じデータに対して複数の関数を実行する必要があります。
質問
私の現在のアプローチは非常に遅いです。ベンチマークはしていませんが、コーヒーを飲みに行って 1 年分のデータが処理される前に戻ることができるほど遅いです。
処理する注文 (数百) の塔があり、それぞれに 1 年間のデータと 10 ~ 12 の高さがあるため、より高速なものを探しています。
データサンプル
data <- structure(list(time = structure(c(1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262304600, 1262304600, 1262304600, 1262304600, 1262304600, 1262304600,
1262305200, 1262305200, 1262305200, 1262305200, 1262305200, 1262305200,
1262305200), class = c("POSIXct", "POSIXt"), tzone = ""), z = c(0,
0, 0, 100, 100, 100, 120, 120, 120, 140, 140, 140, 160, 160,
160, 180, 180, 180, 200, 200, 200, 40, 40, 40, 50, 50, 50, 60,
60, 60, 80, 80, 80, 0, 0, 0, 100, 100, 100, 120), param = c("temperature",
"humidity", "barometric pressure", "wind direction", "turbulence",
"wind speed", "wind direction", "turbulence", "wind speed", "wind direction",
"turbulence", "wind speed", "wind direction", "turbulence", "wind speed",
"wind direction", "turbulence", "wind speed", "wind direction",
"turbulence", "wind speed", "wind direction", "turbulence", "wind speed",
"wind direction", "turbulence", "wind speed", "wind direction",
"turbulence", "wind speed", "wind direction", "turbulence", "wind speed",
"temperature", "barometric pressure", "humidity", "wind direction",
"wind speed", "turbulence", "wind direction"), value = c(-2.5,
41, 816.9, 248.4, 0.11, 4.63, 249.8, 0.28, 4.37, 255.5, 0.32,
4.35, 252.4, 0.77, 5.08, 248.4, 0.65, 3.88, 313, 0.94, 6.35,
250.9, 0.1, 4.75, 253.3, 0.11, 4.68, 255.8, 0.1, 4.78, 254.9,
0.11, 4.7, -3.3, 816.9, 42, 253.2, 2.18, 0.27, 229.5)), .Names = c("time",
"z", "param", "value"), row.names = c(NA, 40L), class = "data.frame")