R中使用as.h2o导入数据时空值被转为NA,如何区分空值与NA?
区分R导入H2O时的空值与NA
我明白你现在的困扰——把R数据导入H2O时,原本的空值和NA全被转成了H2O的NA,根本没法区分对吧?其实这是因为H2O默认的导入逻辑把这两种情况都归为缺失值了,咱们可以通过调整导入参数或者预处理数据来解决,下面是具体方案:
方法1:修改导入参数,精准定义NA范围
H2O的as.h2o和h2o.uploadFile都支持na.strings参数,这个参数用来指定哪些字符串会被识别为H2O的NA。默认情况下,它包含了空字符串("")和"NA",所以咱们可以修改它,只把R里的"NA"标记为H2O的NA,让空值保留原样:
示例代码:
library(h2o) h2o.init() # 用as.h2o导入时指定na.strings,仅识别"NA"为缺失值 h2o_data <- as.h2o(mydata, na.strings = "NA") # 如果用CSV中转的方式: # data.table::fwrite(mydata, "mydata.csv") # h2o_data <- h2o.uploadFile("mydata.csv", na.strings = "NA")
这样处理后,R里原本的NA会被转成H2O的NA,而原本的空值会保留为空字符串"",之后你可以用h2o.isempty()来筛选这些空值。
方法2:预处理数据,给空值加专属标记
如果你担心空字符串在后续处理中容易和其他空内容混淆,可以先在R里把空值替换成一个自定义的专属标记(比如"EMPTY_VALUE"),再导入H2O:
示例代码:
library(data.table) library(h2o) h2o.init() # 复制原数据避免修改原始内容 mydata_processed <- copy(mydata) # 遍历字符型列,把空值替换为自定义标记 for (col in names(mydata_processed)[sapply(mydata_processed, is.character)]) { set(mydata_processed, i = which(mydata_processed[[col]] == ""), j = col, value = "EMPTY_VALUE") } # 导入H2O,此时原NA对应H2O的NA,空值变成"EMPTY_VALUE" h2o_data <- as.h2o(mydata_processed)
之后你可以用h2o_data$col_name == "EMPTY_VALUE"识别原本的空值,用h2o.isna()识别原本的NA,完全区分开两种情况。
关于NA_h2o的小说明
你提到的NA_h2o是H2O内部用来存储缺失值的常量,它不是用来区分空值和NA的标记,只是H2O在内存里表示缺失值的方式,所以没法用它来实现你的需求哦。
内容的提问来源于stack exchange,提问作者Simon R
相关产品推荐
相关产品推荐

