Ik wil graag de lijnen in dit dataframe verwijderen die:
a) alle kolommen NA
bevatten. Hieronder staat mijn voorbeeld-dataframe.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
In principe zou ik graag een dataframe krijgen zoals het volgende.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) bevatten NA
s in slechts enkele kolommen, zodat ik ook dit resultaat kan krijgen:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
Controleer ook complete.cases
:
> final[complete.cases(final), ]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
na.omit
is mooier om gewoon alle NA
's te verwijderen. complete.cases
maakt gedeeltelijke selectie mogelijk door alleen bepaalde kolommen van het dataframe op te nemen:
> final[complete.cases(final[ , 5:6]),]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
Uw oplossing kan'niet werken. Als je erop staat om is.na
te gebruiken, dan moet je iets doen als:
> final[rowSums(is.na(final[ , 5:6])) == 0, ]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
maar complete.cases
gebruiken is een stuk duidelijker, en sneller.
Ik geef de voorkeur aan de volgende manier om te controleren of rijen geen NA's bevatten:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Dit geeft een logische vector met waarden die aangeven of er NA's in een rij staan. Je kunt het gebruiken om te zien hoeveel rijen je moet laten vallen:
sum(row.has.na)
en ze uiteindelijk te laten vallen
final.filtered <- final[!row.has.na,]
Voor het filteren van rijen met bepaalde delen van NAs wordt het wat lastiger (je kunt bijvoorbeeld 'final[,5:6]' aan 'apply' voeren). Over het algemeen lijkt Joris Meys' oplossing eleganter.