Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在R中的大数据框架上定义年间隔的函数_R_Date_Datetime_Dataframe_Apply - Fatal编程技术网

用于在R中的大数据框架上定义年间隔的函数

用于在R中的大数据框架上定义年间隔的函数,r,date,datetime,dataframe,apply,R,Date,Datetime,Dataframe,Apply,我正在研究一个大数据框架,以便为一个增强的回归树模型项目准备这个数据框架。 由于我对R和编程基本上是新手,所以我陷入了数据准备阶段。 我已经花了几个小时思考这个问题,知道我想怎么做。我就是不能在R里做。 我的数据框基本上如下所示: > df <- data.frame(company,start.date,end.date,amount.x,Years.as.customer) > df company start.date end.date amount.x

我正在研究一个大数据框架,以便为一个增强的回归树模型项目准备这个数据框架。 由于我对R和编程基本上是新手,所以我陷入了数据准备阶段。 我已经花了几个小时思考这个问题,知道我想怎么做。我就是不能在R里做。 我的数据框基本上如下所示:

> 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 
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
我认为这可以通过为每个公司定义一个开始日期来实现。因此,如果在
df$company
中出现一个新名称,则从同一行中的
start.date
获取日期,并将其保留在
df$company
中同一公司的所有行中。下一步应该是计算
end.date
s和开始日期之间的时间差。如果时间差大于1,则填写第2年,以此类推

这项工作应该针对一个日期不同的大型日期框架(两个日期之间不一定正好间隔1年,开始和结束日期也不同)以及大约3000家公司

我正在努力定义一个工作函数并将其应用于整个数据帧

我希望我能简单地解释一下这个问题以及我想做些什么。如果有任何不清楚的地方,请随时提问。我会尽量回答清楚

谢谢你们的帮助,伙计们

编辑:年份重叠的问题。(@Hugh)

为了完全解决我描述的问题,我要处理最后一个问题: 我使用了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,因为时间间隔仍然我认为这给出了您想要的:

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)
库(dplyr)
图书馆(lubridate)

df$start.date有几个问题可以澄清您的要求:a)
end.date
start.date
之间的差异是否可以大于一年?b) 对于一家在2012年成为客户,然后又在2014年成为客户,但不是2013年成为客户的公司,您希望看到什么?如果我理解正确:如果每一行只能包含一年的日期,并且每年内的日期只能在一行中给出,那么您可以尝试使用(df,ave(company,company,FUN=seq_-along))
。按格式运行“聚合”(开始,“%Y”)使用公司作为索引,长度(唯一(x))作为函数。谢谢您的提问。@Viktor K:a)时差不能超过一年。b) 我不认为有任何这样的案例。。如果有的话,我认为重新开始第一年是很有价值的。谢谢你的回复。对不起,没有早点回来。这接近我要找的。谢谢你和我分享这些信息。为了得到最终的解决方案,我有两点需要努力。a) 对于大多数公司来说,这种解决方案非常有效,谢谢。对于一些公司来说,新公司的第一行不是从第一年开始的,而是以某种方式接管了前一家公司最后一行的价值。你知道这是什么原因吗?b) 有没有办法每月做一次,而不是增加一整年?有几段时间间隔为两年。。谢谢(a) 我不完全确定你在这里的意思,但如果你的数据不准确,再多的编码也帮不了你。你怎么知道有些公司的第一排被前一排接管了(而不仅仅是巧合)?(b) 你是说当顾客几个月?如果回答了您的问题,请参阅我的编辑。问题(a)请参阅编辑我的问题。这是我挣扎的最后一点。谢谢你到目前为止所做的一切。@Hugh:谢谢你的编辑。使用difftime()进行分组可以正常工作,但$start.date和$end.date中年份不同的日期除外。例如,如果我们将以下两个日期作为公司的第一个日期20:2006-07-01(开始)2007-06-30(结束),那么这两个日期之间的时差是有效的!非常感谢,休!