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
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ı? –
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. –
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