[英]Function to define yearly intervals on big data frame in R
我正在處理一個大數據框,以便為Boosted Regression Tree Model項目准備此數據框。 由於我是R和編程領域的新手,因此我始終處於數據准備的階段。 我已經花了數小時思考這個問題,並且知道我想怎么做。 我只是無法在R中執行此操作。我的數據框基本上如下所示:
start.date
和end.date
表示公司(例如C1
)已成為我潛在公司的客戶的時間間隔。 公司1從2009年1月1日至2009年12月31日以及接下來的兩年是客戶。 變量amount.x
是,支付是我公司的客戶量。
> df <- data.frame(company,start.date,end.date,amount.x)
> df
company start.date end.date amount.x
1 C1 01/01/2009 31/12/2009 10
2 C1 01/01/2010 31/12/2010 20
3 C1 01/01/2011 31/12/2011 5
4 C2 01/01/2009 31/12/2009 7
5 C2 01/01/2010 31/12/2010 12
6 C2 01/01/2011 31/12/2011 11
我正在嘗試添加一個新列,以顯示不同公司成為我公司客戶的年限。 問題在於, start.date
和end.date
之間的時間間隔並不總是恰好是一年。 有時公司成為客戶的時間為一個月,但仍應顯示為1年的客戶。 它看起來應該像這樣:
> df <- data.frame(company,start.date,end.date,amount.x,Years.as.customer)
> df
company start.date end.date amount.x Years.as.customer
1 C1 01/01/2009 31/12/2009 10 1
2 C1 01/01/2010 31/12/2010 20 2
3 C1 01/01/2011 31/12/2011 5 3
4 C2 01/01/2009 31/12/2009 7 1
5 C2 01/01/2010 31/12/2010 12 2
6 C2 01/01/2011 31/12/2011 11 3
我認為可以通過定義每個公司的開始日期來實現。 因此,如果在df$company
出現了新名稱,請從同一行中的start.date
開始獲取日期, start.date
其保留在df$company
同一公司的所有行中。 下一步應該是計算end.date
與開始日期之間的時間差。 如果差異小於等於1年,請在df$years
寫入1。 如果:2 => time diff> 1,則寫出第二年等
對於具有不同日期(兩個日期之間不一定總是准確的一年,起始日期和結束日期之間並不總是精確的一年)和大約3000家公司的大型日期框架,應該這樣做。
我正在努力定義一個工作功能並將其應用於整個數據框架。
我希望我能簡要地解釋這個問題以及我想對此做些什么。 如有疑問,請隨時提問。 我會盡力回答。
伙計們,謝謝您的幫助。
編輯:重疊年份的問題。 (@Hugh)
為了完全解決我描述的問題,我要處理的最后一個問題是:我使用了dplyr和lubridate軟件包結合使用的休的解決方案(請參閱注釋)。 查看下面用代碼編寫的結果
company start.date end.date Years.as.customer
C20 2010-07-10 2010-09-30 1
C20 2010-07-10 2011-06-30 2
C20 2010-07-10 2011-06-30 2
C20 2010-07-10 2011-06-30 2
C20 2010-07-10 2011-06-30 2
C20 2010-07-10 2011-06-30 2
C20 2010-10-01 2010-12-31 1
C20 2011-01-01 2011-03-31 2
C20 2011-04-01 2011-06-30 2
問題在於,公司C20僅是客戶的一年。 如果將第一行作為開始,則所有日期(從start.date列中的第一個日期到end.date列中的最后一個日期)都將為一年。 我猜想當end.date列中的年份從2010年更改為2011年時,Years.as.customer列中的值也會從1更改為2。 對於所有給定的行,它應該保持為1,因為時間間隔仍小於等於1年。 任何想法如何做到這一點?
提前致謝。
我認為這可以滿足您的需求:
library(dplyr)
library(lubridate)
df$start.date <- as.Date(df$start.date, format="%d/%m/%Y")
df$end.date <- as.Date(df$end.date, format="%d/%m/%Y")
df %.%
group_by(company) %.%
# mutate(Years.as.customer = year(end.date) - min(year(start.date)) + 1)
mutate(Years.as.customer =
ceiling((end.date - min(start.date))/365.25))
# months
library(zoo)
df %.%
group_by(company) %.%
mutate(Months.as.customer = as.yearmon(end.date) - min(as.yearmon(start.date)) + 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.