我在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
答案 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