如果数据帧是列表列表,那么.na(df)如何工作?

时间:2016-07-22 18:38:04

标签: r dataframe

我有一个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)的向量,每列一个。

相反,它以某种方式做了别的事情。这是如何工作的?

1 个答案:

答案 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"))