我有一个data.frame,我想找出其中的哪些值是NA。所以我可以做// Source code
void loadDataFile(FILE* input) {
assert(input != NULL);
...
}
// Test code
TEST_CASE("loadDataFile asserts out when passed NULL", "[loadDataFile]") {
loadDataFile(NULL)
// Now what do I look for?
}
。这很好用,但我不明白为什么。我认为data.frame是一个列表列表,因此要求is.na(df)
告诉我这些列表中的每一个是否都是NA,当然他们不是(因为他们的列表)。所以我认为它将返回is.na(df)
的向量,每列一个。
答案 0 :(得分:5)
您可以查看代码并查看.data.frame
- 方法的作用:
> methods(is.na)
[1] is.na,abIndex-method is.na,denseMatrix-method is.na,indMatrix-method
[4] is.na,nsparseMatrix-method is.na,nsparseVector-method is.na,sparseMatrix-method
[7] is.na,sparseVector-method is.na.coxph.penalty* is.na.data.frame
[10] is.na.data.table* is.na.numeric_version is.na.POSIXlt
[13] is.na.raster* is.na.ratetable* is.na.Surv
[16] is.na.times*
see '?methods' for accessing help and source code
> is.na.data.frame
function (x)
{
y <- if (length(x)) {
do.call("cbind", lapply(x, "is.na"))
}
else matrix(FALSE, length(row.names(x)), 0)
if (.row_names_info(x) > 0L)
rownames(y) <- row.names(x)
y
}
<bytecode: 0x7fc7187b5f48>
<environment: namespace:base>
所以在大多数情况下。当数据框中有任何内容时,它只是首先使用is.na和cbind
创建一个逻辑向量列表 - 它们(返回一个矩阵对象)。
do.call("cbind", lapply(x, "is.na"))