具有缺失值的yearmon作为R中的字符

时间:2016-06-28 15:58:40

标签: r date data.table zoo

我在R中有一个大型数据集,在data.table中,其中一些列包含yyyy-mm格式的日期。其中一些具有缺失值,表示为“ND”。

我正在寻找一个全面的解决方案,在data.table的“if”部分的这些列上使用as.monarmon(x)的“zoo”包,而不会产生以下错误: “as.yearmon.character(x)中的错误:yearmon变量只能有一种格式”

as.yearmon(x)在只包含yyyy-mm格式的日期的列上工作正常,它也适用于不包含日期的列,只有“ND”等文本,在这种情况下它只给出NA的。当这些组合在一起时会出现问题,即有一个列具有日期和其他文本,例如“ND”,此时会出现上述错误。

解决这个问题的一种方法是创建新的列,其中“ND”被NA替换,但这似乎需要反复使用大量代码,因为它是一个非常大的数据集。如果原始的“x”没有改变,我也会更喜欢它,因为它也被用于许多其他目的。

以下是一些澄清的代码:

x <- c("2016-06","2016-07","ND")
DT <- data.table(x)
DT[as.yearmon(DT$x) > as.yearmon("2016-01") , y := 1]

在某种程度上,我希望as.yearmon(x)作为输出:

DT$y
1 1 NA

2 个答案:

答案 0 :(得分:2)

我们可以在grep中使用i创建逻辑索引,并检查'​​x'的yearmon是否大于'2016-01',转换为{{ 1}}和assign(integer)为新列'y'。

:=

或者在评论中提到的@Frank,我们可以使用DT[!grepl("[[:alpha:]]+", x), y := as.integer(as.yearmon(x) > as.yearmon("2016-01")) ] DT$y #[1] 1 1 NA

%like%

答案 1 :(得分:1)

另一个解决方案是转换&#34; ND&#34;事先进入NA。例如:

x <- as.yearmon(gsub("ND", NA, c("2016-06","2016-07","ND"), fixed=TRUE))
DT <- data.table(x)
DT[as.yearmon(x) > as.yearmon("2016-01") , y := 1]

或在data.table中

x <- c("2016-06","2016-07","ND")
DT <- data.table(x)
DT[, .(x=as.yearmon(gsub("ND", NA, c("2016-06","2016-07","ND"), fixed=TRUE)))
   ][x > as.yearmon("2016-01"), y := 1][]

哪两个都返回

DT
          x  y
1: Jun 2016  1
2: Jul 2016  1
3:     <NA> NA