2
votes

Comment supprimer data.frame vide dans une liste après un sous-paramétrage dans R

Supposons que je sous-ensemble à partir d'une liste de data.frame s nommés par rapport à une variable de sous-ensemble appelée long .

Après le sous-ensemble, certains data.frame dans la liste peuvent être vides car il n'y a pas de correspondance pour le sous-ensemble.

Je me demandais comment je pourrait supprimer tous ces data.frame s vides dans ma sortie finale.

Un exemple simple et ma solution infructueuse sont indiqués ci-dessous: p >

b <- list(Study1 = data.frame(d = 6:8, long = c(F, F,F)), Study2 = data.frame(d = 9:11, long = c(T, T, F)) )


( h <- lapply(b, subset, subset = long) ) ## subset with respect to "long"

## OUTPUT:

   $Study1
   [1] d    long
    <0 rows> (or 0-length row.names)   ## This data.frame is empty!! must be deleted ##!

   $Study2
    d long
    1  9 TRUE
    2 10 TRUE


## I tried the following with no success: ##

for(i in 1:2) if(nrow(h[[i]]) == 0) h[[i]] <- NULL else h[[i]]


0 commentaires

3 Réponses :


6
votes

Simplement Filtrer par nombre de lignes:

new_list_of_dfs <- Filter(NROW, list_of_dfs)


0 commentaires

1
votes

Nous pouvons utiliser keep

h[sapply(h, nrow) > 0]

Ou utiliser sapply de base R pour créer une condition logique et Extraire les éléments de liste

library(purrr)
keep(h, ~ nrow(.x) > 0)
#$Study2
#   d long
#1  9 TRUE
#2 10 TRUE


0 commentaires

1
votes

La réponse de akrun fonctionne mais pour comprendre pourquoi votre dernière ligne de code n'a pas fonctionné ( for (i in 1: 2) if (nrow (h [[i]] ) == 0) h [[i]] ): c'est parce que vous supprimez un élément de votre liste avant que la boucle ne puisse se terminer. Donc, enregistrez d'abord votre requête dans un index, puis utilisez les résultats de cette requête pour supprimer les éléments sur une deuxième ligne. Plus verbeux mais plus d'apprentissage pour vous:

index <- vector(mode = 'logical', length = length(h)) #initialize index as all FALSE
for (i in 1:length(h)) { #this is your last line of code, modified
  if(nrow(h[[i]]) != 0) {
    index[i] <- TRUE
    } else {next} 
}
h <- h[index]


0 commentaires