我有大量的data.table,有600万行。
示例数据是:
DT:
VAR1 VAR2 VAR3.....
6 5
NA 5 1
"?" 2 0
我想重新定义两列。 我使用下面的代码,它的工作非常慢。
DT=DT[,':='(VAR1=ifelse(DT$VAR1 == "?" | is.na(DT$VAR1) | is.null(DT$VAR1) |
length(DT$VAR1) == 0 , 1 , DT$VAR1),
VAR2 = ifelse ( DT$VAR2 == "?" | is.na(DT$VAR2) |
is.null(DT$VAR2) | length(DT$VAR2) == 0, "" , DT$VAR2)) ,with=FALSE]
有没有办法可以修改代码,以便更快地运行?
答案 0 :(得分:2)
我不确定你到底想要做什么,但是你在如何操作data.table
对象时遇到了几个基本错误:
DT=DT
作为:=
更新DT
参考DT
无需在data.table
对象范围内引用DT$VAR1
,而只需执行VAR1
ifelse
非常低效且缓慢(尽管被矢量化)所以总是尽量避免它(特别是嵌入ifelse
)。在您的情况下,我怀疑您尝试使用1
中的VAR1
和""
中的VAR2
来替换不是数字的所有内容,对吗?如果是这样,您只能查找数值,因此,请避免使用ifelse
语句尝试
DT[!grepl("\\d", VAR1), VAR1 := "1"]
DT[!grepl("\\d", VAR2), VAR2 := ""]
将返回(对于您的示例数据集)
DT
# VAR1 VAR2 VAR3
# 1: 6 5
# 2: 1 5 1
# 3: 1 2 0