2016-04-02 11 views
2

Her yakalama için yakalama tarihi, türü ve kişi sayısı olan bir formatta kamera yakalama verileri var. Örneğin:Kombinasyonlar yapılırken kullanılacak ddply {plyr} değerleri için bir değer aralığı tanımlama

> 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 

Her tarih ve türlerin kombinasyonu için bir giriş, böylece sıfır değerleri, veri kümesi, belirli bir gün için kaydedilen her bir türün toplam sayısı toplamı değil, aynı zamanda genişletme istiyoruz Belirli bir türün gözlemi olmadan tarihler. Bunu ddply {plyr} ve .drop=FALSE komutuyla yapabilirim.

> 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 

sorun, gözlem (yukarıdaki örnekte, bu 1/2/2015 olacaktır) herhangi bir türden için ifade edildiği birkaç gün olmasıdır.

> 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 

bir vektör içinde bir tarih aralığı tanımlamak ve özgün dataframe yerine yalnızca benzersiz tarihlerin o kullanmak ddply sormak için bir yolu var mı: Böyle bir şey ne dönmek istiyorum nedir?

Göreceli olarak R ve SO için yeniyim, bu yüzden eğer bir sorudan çok sarsılmışsa önceden özür dilerim.

cevap

1

'Tarih'i Date sınıfına dönüştürürüz. En az "Tarih" ve unique "Sp" öğelerinden oluşan bir dizi kombinasyonu ile yeni bir veri kümesi oluşturun. Ya merge (base R'dan) ya da kullanarak 'Tarih' ve 'Tarih' tarafından gruplanan 'Num' sütununun sum değerini elde ettik.

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

Cevabınız için teşekkür ederiz. Bazı kamera sitelerinde, ilk ya da son birkaç gün boyunca gözlem yapmam, bu yüzden min/max tarihlerini tarih aralığını tanımlamak için sıfır gözlemleri kaydetmem gereken günler çıkıyor. Tarih aralığını tanımlamaya çalıştım. expand.grid (Date = seq (min (2015-1-1), max (2015-1-20), by = "1 gün") 'dır, ancak işe yaramıyor gibi görünmektedir. ? –

+0

@etis "2015-1-1" e baktığımızda, "Date" sınıfından değil. "Date" sınıfına dönüştürün ve sonra "min" ve "max" sekanslarını alın. – akrun

İlgili konular