簡體   English   中英

在R中的大數據幀上定義年度間隔的功能

[英]Function to define yearly intervals on big data frame in R

我正在處理一個大數據框,以便為Boosted Regression Tree Model項目准備此數據框。 由於我是R和編程領域的新手,因此我始終處於數據准備的階段。 我已經花了數小時思考這個問題,並且知道我想怎么做。 我只是無法在R中執行此操作。我的數據框基本上如下所示:

start.dateend.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.dateend.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM