2016-04-02 5 views
2

キャプチャの日付、種、個体数のカメラトラップデータを観測毎に持っています。例えば:組み合わせを作成するときにddply {plyr}の値の範囲を定義する

> df 
     Date Sp Num 
1 1/1/2015 a 1 
2 1/1/2015 a 1 
3 1/1/2015 b 2 
4 1/3/2015 a 4 

Iは各日付および種の組み合わせのエントリが存在するようにするためのゼロ値と、データセットを所定の日に記録された各種類の総数を合計するだけでなく、拡大したいです特定の種の観察なしに日付。私はddply {plyr}コマンドと.drop=FALSEコマンドでこれを行うことができます。

> ddply(df, c("Date", "Sp"), function(df)sum(df$Num), .drop=FALSE) 
     Date Sp V1 
1 1/1/2015 a 2 
2 1/1/2015 b 2 
3 1/3/2015 a 4 
4 1/3/2015 b 0 

問題は、任意の種のための観測が行われていないされたいくつかの日(上記の例で、これは2015年1月2日であろう)があることです。

> df 
     Date Sp Num 
1 1/1/2015 a 2 
2 1/1/2015 b 2 
3 1/2/2015 a 0 
4 1/2/2015 b 0 
5 1/3/2015 a 4 
6 1/3/2015 b 0 

ベクトルで日付の範囲を定義し、元のデータフレームからだけではなく、固有の日付のものを使用するddply依頼する方法があります:このような何か私は返すしたいのですか?

私はRとSOには比較的新しいので、あまりにも複雑な質問があれば、事前にお詫びします。

答えて

1

「日付」をDateクラスに変換します。最小値から最大値 "Date"までのシーケンスと "Sp"のunique要素の組み合わせで新しいデータセットを作成します。 「Num」列のsumが「Date」と「Sp」でグループ化された後、mergebase R)またはleft_joindplyrから使用してください。

df$Date <- as.Date(df$Date, "%m/%d/%Y") 
df1 <- expand.grid(Date=seq(min(df$Date), max(df$Date), 
    by = "1 day"), Sp=unique(df$Sp), stringsAsFactors=FALSE) 
library(dplyr) 
df %>% 
    group_by(Date, Sp) %>% 
    summarise(Num = sum(Num)) %>% 
    left_join(df1, .) %>% 
    mutate(Num = replace(Num, is.na(Num), 0)) %>% 
    arrange(Date) %>% 
    mutate(Date = format(Date, "%m/%d/%Y")) 
#  Date Sp Num 
#1 01/01/2015 a 2 
#2 01/01/2015 b 2 
#3 01/02/2015 a 0 
#4 01/02/2015 b 0 
#5 01/03/2015 a 4 
#6 01/03/2015 b 0 
+0

ご回答ありがとうございます。いくつかのカメラサイトでは、私は最初または最後の数日間の観測を持っていないので、最小/最大日付として日付範囲を定義すると、ゼロ観測を記録する必要がある日が省かれます。 'expand.grid(Date = seq(min(2015-1-1)、max(2015-1-20)、by =" 1 day ")'でも動作しないようです。 ? –

+0

@etis '2015-1-1'を見ると' Date'クラスではない 'Date'クラスに変換し、' min'と 'max'の' seq'を取得します – akrun

関連する問題