使用用户定义的函数处理向量中的 NA
Dealing with NAs in vectors with user-defined functions
我正在尝试在 R 中创建一个函数来复制 Excel 的 EOMonth 函数(即,您输入一个日期和月份数,它 return 就是您结束输入日期之前/之后相同月数的月份日期)。我有一个函数可以使用 lubridate 包处理单个输入:
EOMonth <- function(date, months)
{
NewDate <- date %m+% months(months)
NewDate <- ceiling_date(NewDate, "month") - days(1)
}
问题是如何 'vectorise' 这个(不确定这个词是否正确)。当我向函数传递一个向量(在本例中是数据框中的一列)时,我收到以下消息:
NAs are not allowed in subscripted assignments
我不想忽略向量中的任何 NA(因为我将结果发送到数据框中的新列)。我只希望该函数在看到 NA 时 return 一个 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)
应该return 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
一个解决方案是首先制作一个 NA 向量,然后只处理 date
的非 NA 元素。请注意 NA class 需要 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)
我正在尝试在 R 中创建一个函数来复制 Excel 的 EOMonth 函数(即,您输入一个日期和月份数,它 return 就是您结束输入日期之前/之后相同月数的月份日期)。我有一个函数可以使用 lubridate 包处理单个输入:
EOMonth <- function(date, months)
{
NewDate <- date %m+% months(months)
NewDate <- ceiling_date(NewDate, "month") - days(1)
}
问题是如何 'vectorise' 这个(不确定这个词是否正确)。当我向函数传递一个向量(在本例中是数据框中的一列)时,我收到以下消息:
NAs are not allowed in subscripted assignments
我不想忽略向量中的任何 NA(因为我将结果发送到数据框中的新列)。我只希望该函数在看到 NA 时 return 一个 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)
应该return 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
一个解决方案是首先制作一个 NA 向量,然后只处理 date
的非 NA 元素。请注意 NA class 需要 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)