2016-06-28 90 views
0

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

我正在寻找一个全面的解决方案,在data.table的“if”部分的这些列的“zoo”包中使用as.yearmon(x),而不会产生以下错误: “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 
+1

我认为,(1)你应该使用,而不是试图与合作的r NA格式你自己的'is.na(x)< - (x ==“ND”)'和(2)你应该将你的数据存储为yearmon,而不是随意转换它'DT = data.table(x = as .yearmon(x))' – Frank

回答

2

我们可以创建一个逻辑索引与grepi并检查'x'的yearmon是否大于'2016-01'的值,转换为integer,并将赋值(:=)作为新列'y'。

DT[!grepl("[[:alpha:]]+", x), y := as.integer(as.yearmon(x) > as.yearmon("2016-01")) ] 
DT$y 
#[1] 1 1 NA 

或者像@Frank在评论中提到的,我们可以用%like%

DT[!x %like% "ND", y := as.integer(as.yearmon(x) > as.yearmon("2016-01")) ] 
1

另一种解决方案是预先改造 “的ND” 为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 
+0

喜欢你的答案 – nik