为什么在这个数据框上与 is.na 一起使用时应用 return 矩阵?

Why does sapply return a matrix when used with is.na on this data frame?

我正在尝试获取数据框列中存在的所有 NA 的计数,而 sapply() 正在返回一个矩阵。相同的尺寸和所有内容,之后很容易调用 data.frame() ,但我很好奇为什么要这样做。 apply([df], 1, [is.na]) 似乎做同样的事情。有什么想法吗?下面的可重现代码。

df1 <-data.frame(matrix(c(rep(c(1:10, NA), 9), NA), nrow = 10)) 
  #make a data frame with some NAs
df2 <- sapply(df1, is.na)
class(df2) 
  #returns "matrix"
df3 <- apply(df1, 1, is.na)
class(df3) 
  #also returns "matrix"

因为 lapply 对列表进行操作和强制转换,而 sapplylapply 的 "simplified" 形式,它试图方便并强制转换为向量或矩阵取决于结果。

来自文档:

lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X. sapply is a “user-friendly” version of lapply by default returning a vector or matrix if appropriate.