2016-06-28 124 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