2017-08-06 4 views
-2

J'essaie d'obtenir un compte de toutes les NA présentes dans les colonnes d'une trame de données, et sapply() retourne une matrice. Les mêmes dimensions et tout et il est assez facile d'appeler data.frame() par la suite, mais je suis curieux de savoir pourquoi il le fait. Il semble que apply ([df], 1, [is.na]) fait la même chose. Des pensées? Code reproductible ci-dessous.Pourquoi retourne-t-il une matrice lorsqu'elle est utilisée avec is.na sur cette trame de données?

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" 

Répondre

2

Parce que lapply fonctionne sur et à des listes contraint, et sapply est une forme de lapply « simplifiée » qui essaye d'être pratique et contraindre à un vecteur ou une matrice en fonction du résultat.

De la documentation:

retourne lapply une liste de la même longueur que X, chaque élément qui est le résultat de l'application FUN à l'élément correspondant de X. sapply est un « convivial "Version de lapply par défaut renvoyant un vecteur ou une matrice si approprié.

+1

... et la citation directe correspondante de '? Apply':" Si X n'est pas un tableau mais un objet d'une classe avec une valeur dim non nulle (comme une trame de données), appliquer des tentatives de le contraindre à un tableau via as.matrix s'il est bidimensionnel (par exemple, une trame de données) ou via as.array. ". – joran