【问题标题】:Dealing with NAs in vectors with user-defined functions使用用户定义的函数处理向量中的 NA
【发布时间】:2016-08-08 11:09:55
【问题描述】:

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

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

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

下标作业中不允许使用 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 个月后每个日期的月末:

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

【问题讨论】:

  • 您有示例数据吗?这大大增加了人们快速回答您问题的机会。
  • 嗨桑德。当然。我应该粘贴到我原来的评论吗?我很少在网站上提问,所以有点不知所措。对不起。
  • 您可以编辑您的问题,并添加示例数据!你可以简单地在你的数据框上做一个head( dput() )
  • 好的。数据框有数百个字段,所以我只是在问题中添加了几行预期的输出。希望这会有所帮助。

标签: r lubridate


【解决方案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)

【讨论】:

  • 这太棒了,就像一个魅力。谢谢,理查德。将标记为我的答案。
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2017-11-15
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多