私は、複数年にわたる気象変数(日々の値)のデータセットから情報を抽出しようとしています。雪の有無は、データセットで1と0としてコード化されています。各行は1日に対応し、日付と半年のカラムはコディです。 各半年間、私は雪の存在が最後に発生した後の日付の値を見つけようとしています(1)。私は、集計を介して変数をグループ化することでこれを試みましたが、「集計」は名前のないデータフレームの列を渡すように見えるため、カスタム関数の使用は成功しませんでした。「集計」とユーザ作成の関数を組み合わせる
dates<-c("1993-01-01","1993-01-02","1993-01-03","1993-01-04","1993-01-05","1994-02-20","1994-02-21","1994-02-22","1994-02-23","1994-02-24")
df<-data.frame(Date=as.Date(dates,format = "%Y-%m-%d"),
halves=as.factor(c(1993-01-01,1993-01-01,1993-01-01,1993-01-01,1993-01-01,1994-01-01,1994-01-01,1994-01-01,1994-01-01,1994-01-01)),
plot1=c(1,1,1,0,0,1,1,0,0,0),
plot2=c(1,1,0,0,0,1,1,0,1,0),
plot3=c(0,1,1,1,0,1,1,1,0,0))
私はループを使用すると、その効率的ではないことを知っているが、私は「ないプロット-列」に関数を適用しないようにしたいので、私が使用しています:
for(plots in names(df)[- which(names(df) %in% c("Date","halves"))]){
meltday[[plots<-aggregate(df[[plots]]~halves,df,df$Date[last(which(snow.days.half$Date==0)) + 1])
}
これはエラーを生成します最後の部分は関数として評価されないためです。 私は、すべてのプロット列で最後に発生した1の日付+ 1を見つけるために自家製関数を試しました。関数はリストにその入力を強制的に変換するので
snowmelt<-function(x)
{snowmelt<-max(x[[Date]][x[[plots]]==1])
snowmelt}
しかし、その後
for(plots in names(df)[- which(names(df) %in% c("Date","halves"))]){
meltday[[plots]]<-aggregate(df[[plots]] ~ halves,df,snowmelt)
}
をしようとは、エラー文で私を残しました。
私は非常に固執しており、正しい方向に向いているコメントや回答には非常に感謝し、賛同するでしょう。 私の所望の出力は、それの日付を持つデータフレームのようになります。明確化のための追加所望の出力:
>meltday
halves plot1 plot2 plot3
1993-01-04 1993-01-04 1993-01-03 1993-01-05
1994-01-01 1994-02-22 1994-02-24 1994-02-23
EDITのラインに沿って。
ありがとうございます! tidyr
と私はあなたが入力OPでhalves
変数は文字ベクトルを使用する方法に変更し
dplyr
を使用して
あなたがplyr、dplyrまたはdata.tableのための好みを持っていますか?これらは、このタスクを実行するのに役立つ3つのパッケージです。 – stephematician
この問題ではdplyrで何かを試してみましたが、管理しませんでした.-:df%>%group_by(半分)%>%mutate(Snow.Melt = Date [ ]] == 0))+ 1]) ' - – Ronja
あなたの望む出力はどのように見えますか? –