在具有用户定义函数的向量中处理NA

时间:2016-08-08 11:09:55

标签: r lubridate

我试图在R中创建一个复制Excel的EOMonth函数的函数(即您输入一个日期和一些月份,它会返回相同数量的月份日期的月末日期输入日期之前/之后的几个月)。我有一个使用lubridate包在单个输入上工作的函数:

EOMonth <- function(date, months) 
{ 
  NewDate <- date %m+% months(months) 
  NewDate <- ceiling_date(NewDate, "month") - days(1)
}

问题是如何“矢量化”&#39;这(不确定这是正确的词)。当我向函数传递一个向量(在本例中是数据框中的一列)时,我得到以下消息:

  

下属作业中不允许使用NA

我不想忽略向量中的任何NA(因为我将结果发送到数据框中的新列)。我只是希望函数在看到NA时返回NA,但是按照函数的指示处理所有有效日期。我真的很困惑如何做到这一点;我在这个主题上看到的大多数帖子都涉及如何忽略/删除结果中的NA。

非常感谢任何帮助。

感谢。

编辑。添加了一些示例数据。以下是示例输入数据:

01/07/2016
NA
22/07/2016
NA
30/06/2016
22/07/2016
22/07/2016
29/07/2016
NA
22/07/2016
30/06/2016
NA
31/01/2016
02/08/2016

所以,输入以下内容:

newVector <- EOMonth(OldVector, 3)

应该在3个月内的每个日期返回月末&#39;时间:

31/10/2016
NA
31/10/2016
NA
30/09/2016
31/10/2016
31/10/2016
31/10/2016
NA
31/10/2016
30/09/2016
NA
NA
30/04/2016
30/11/2016

1 个答案:

答案 0 :(得分:1)

一种解决方案是首先制作NA矢量,然后仅处理date的非NA元素。请注意,NA类必须为date或日期转换为数字。

EOMonth <- function(date, months) 
{
  NewDate <- date(rep(NA, length(date)))
  NewDate[!is.na(date)] <- date[!is.na(date)] %m+% months(months) 
  NewDate[!is.na(date)] <- ceiling_date(NewDate[!is.na(date)], "month") - days(1)
  NewDate
}

EOMonth(OldVector, 3)