带有缺失值的 yearmon 作为 R 中的字符
yearmon with missing values as characters in R
我在 data.table 中有一个大型 R 数据集,其中一些列包含 yyyy-mm 格式的日期。其中一些有缺失值,表示为 "ND".
我正在寻找一个全面的解决方案,以在 data.table 的 "if" 部分的这些列上使用 "zoo" 包的 as.yearmon(x) 而不会生成以下错误:
"Error in as.yearmon.character(x) : yearmon variable can only have one format"
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
我们可以在i
中创建一个逻辑索引grep
,检查'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")) ]
另一种解决方案是事先将"NDs"转换为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][]
这两个return
DT
x y
1: Jun 2016 1
2: Jul 2016 1
3: <NA> NA
我在 data.table 中有一个大型 R 数据集,其中一些列包含 yyyy-mm 格式的日期。其中一些有缺失值,表示为 "ND".
我正在寻找一个全面的解决方案,以在 data.table 的 "if" 部分的这些列上使用 "zoo" 包的 as.yearmon(x) 而不会生成以下错误: "Error in as.yearmon.character(x) : yearmon variable can only have one format"
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
我们可以在i
中创建一个逻辑索引grep
,检查'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")) ]
另一种解决方案是事先将"NDs"转换为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][]
这两个return
DT
x y
1: Jun 2016 1
2: Jul 2016 1
3: <NA> NA