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

R 如果数据帧是列表的列表,那么is.na(df)是如何工作的?,r,dataframe,R,Dataframe,我有一个data.frame,我想知道其中哪些值是NA。所以我可以做is.na(df)。这很有效,但我不明白为什么。我认为data.frame是一个列表列表,因此询问is.na(df)会告诉我这些列表中的每一个是否都是na,当然不是(因为它们是列表)。所以我认为它会返回一个向量FALSE,每列一个 相反,它以某种方式做了其他事情。这是如何工作的?您可以查看代码并查看.data.frame-方法的功能: > methods(is.na) [1] is.na,abIndex-method

我有一个data.frame,我想知道其中哪些值是NA。所以我可以做
is.na(df)
。这很有效,但我不明白为什么。我认为data.frame是一个列表列表,因此询问
is.na(df)
会告诉我这些列表中的每一个是否都是na,当然不是(因为它们是列表)。所以我认为它会返回一个向量
FALSE
,每列一个


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

您可以查看代码并查看
.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>

您可以查看代码并查看
.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.data.frame
,它将
is.na
函数跨列传递一次。因此,例如,如果
x
是数据帧中的一列,那么看看
x会发生什么大多数数据帧不是列表列表,而是向量列表。看看
is.na.data.frame
,它将
is.na
函数跨列传递一次。例如,如果
x
是数据帧中的一列,那么看看
x会发生什么大多数数据帧不是列表列表,而是向量列表。