2016-04-06 18 views
2

bir veri çerçevesi vardır varsayalım sağlar ay sütununda bir fark yaratmakdplyr ile grubu ile eşsiz gözlemlerinin bir düzenin oluşturma ve

  1. aydan aya bir boşluk varsa, dizinin
  2. benzersiz kullanıcı Kont boşluk kaç ay sayılır.

İstenilen çıkışına: Aksi 2015-11-262015-12-26 daha uzun bir aydan kabul edildiğinden

User Date  Count Gap 
    aaaa 2015-11-26 1  0 
    aaaa 2015-12-26 2  0 
    aaaa 2016-01-26 3  0 
    bbbb 2014-10-15 1  0 
    bbbb 2014-11-15 2  0 
    bbbb 2015-05-16 3  6 
+1

Kullanıcı dizisi 'idi c ("aaaa", "aaaa", "bbbb", "aaaa", "bbbb" Ya eğer, "bbbb") '? Sonuç aynı mı olmalı? Yoksa bu, Kullanıcı aaaa' için yeni bir sıralama başlatır mı? –

+0

Hayır, dizi a, a, b, a, b, b 'idi - sayım '1,2,1,3,2,3' olarak dönmelidir - gerçek veri çerçevesi binlerce benzersiz kullanıcıya sahiptir ve on binlerce gözlem. İhtiyaçları varsa, tek tek kullanıcı tarafından kolayca gruplandırılabilsem de hepsinin karıştığını farz ediyorum. –

+0

Bir seçenek gibi görünüyor: http://stackoverflow.com/q/22287062 dplyr içinde "sayma" için, sadece group_by ve row_number yapın. – Frank

cevap

0

zoo::as.yearmon() kullanarak, ancak, round gerekiyordu. Belki de bu hesaplamanın nasıl daha "sezgisel" hale getirileceği hakkında yorum yapabilir/düzenleyebilir/açıklayabilir.

library(dplyr) 
library(zoo) 

df %>% 
    group_by(User) %>% 
    mutate(Count = 1:n(), 
     Gap_In_Months = round(12 * as.numeric(as.yearmon(Date) - as.yearmon(lag(Date))), 1), 
     Gap = ifelse(Gap_In_Months <= 1 | is.na(Gap_In_Months), 0, Gap_In_Months)) 

#  User  Date Count Gap_In_Months Gap 
# (fctr)  (fctr) (int)   (dbl) (dbl) 
# 1 aaaa 2015-11-26  1   NA  0 
# 2 aaaa 2015-12-26  2    1  0 
# 3 aaaa 2016-01-26  3    1  0 
# 4 bbbb 2014-10-15  1   NA  0 
# 5 bbbb 2014-11-15  2    1  0 
# 6 bbbb 2015-05-16  3    6  6 

Belki de "bir ay nedir" konusunda daha spesifik olmak istersiniz? 30 gün? 31 gün mü? 28 gün mü? Eğer durum buysa

, biz lubrdiate yararlanabilirler:

library(lubridate) 

df %>% 
    group_by(User) %>% 
    mutate(Count = 1:n(), 
     Diff_Time = ymd(Date) - ymd(lag(Date)), 
     Gap = ifelse(Diff_Time <= ddays(31) | is.na(Diff_Time), 0, as.numeric(Diff_Time, units = "days"))) 

#  User  Date Count Diff_Time Gap 
# (fctr)  (fctr) (int) (dfft) (dbl) 
# 1 aaaa 2015-11-26  1 NA days  0 
# 2 aaaa 2015-12-26  2 30 days  0 
# 3 aaaa 2016-01-26  3 31 days  0 
# 4 bbbb 2014-10-15  1 NA days  0 
# 5 bbbb 2014-11-15  2 31 days  0 
# 6 bbbb 2015-05-16  3 182 days 182 
+0

tatlı! - Ben anlamaya Gerçekten de, bir ay içinde tam anlamıyla ay tamsayı anlamındayım. Gün değeri üzerinde çalıştığım şey için gereksizdir. –

+0

Bu iyi, ama dikkatli olun - düşünün '2015-11-30 "- 2015-12-01" - bu yazılan yol, bu sizin niyetiniz ne olabileceği veya olmayabileceği bir aylık bir aralık olarak düşünülebilir.Arağın hesaplamasını tutmak için daha fazla neden (örneğin, Gap_In_Months 'veriye eklenmiştir – JasonAizkalns