2013-01-03 4 views
1

J'essaie d'obtenir toutes les lignes où les valeurs spécifiques (ici RATIO1 et RATIO 2) sont NaN et les garder.R obtenir des lignes où toutes les valeurs sont NaN

envisager une trame de données comme

data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), 
      RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5)) 

ID RATIO1 RATIO2 RATIO3 
1 1 NaN NaN 0.3 
2 2 NaN NaN 0.2 
3 4 0.2 0.5  4 
4 6 9.5 NaN NaN 
5 7  6  6  5 

Je veux que ça ressemble à ce

ID RATIO1 RATIO2 RATIO3 
1 1 NaN NaN 0.3 
2 2 NaN NaN 0.2 

je pouvais le faire en utilisant is.na() ou complete.cases() < - cela efface les lignes.

Thx

+1

Pourquoi ne pas aligner # 4? – joran

+0

voir edit, im sry. – hendrik

+0

disons: les rapports sont d'origine sepcifique et je voudrais obtenir les "rangées" spécifiques à l'origine par exemple pour ratio3 -> ratio2 et le ratio 1 doit être NaN (par exemple non trouvé dans l'échantillon) – hendrik

Répondre

4

En supposant que vous êtes vraiment affaire avec NaN et non une valeur de caractère arbitraire, essayez quelque chose comme ceci:

dat <- data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5)) 
> dat[is.nan(dat$RATIO1) & is.nan(dat$RATIO2),] 
    ID RATIO1 RATIO2 RATIO3 
1 1 NaN NaN 0.3 
2 2 NaN NaN 0.2 

is.finite pourrait également s'avérer utile si vous faites ce genre de chose souvent.

5

est ici une possibilité, en utilisant apply() d'examiner les lignes une à la fois et déterminer si elles sont entièrement composées de NaN s:

df[apply(df[2:3], 1, function(X) all(is.nan(X))),] 
# ID RATIO1 RATIO2 RATIO3 
# 1 1 NaN NaN 0.3 
# 2 2 NaN NaN 0.2 
+0

J'aime ça pour être une solution qui n'est pas seulement liée à des colonnes spécifiques. – Serenthia

0

Vous pouvez utiliser ceci:

df <- data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), 
        RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5)) 

df[is.nan(df$RATIO1) & is.nan(df$RATIO2),] 

    ID RATIO1 RATIO2 RATIO3 
1 1 NaN NaN 0.3 
2 2 NaN NaN 0.2 
+0

Mais cela garderait les lignes qui contiennent 'NA's (et pas seulement' NaN's) dans les colonnes 2 et 3 ... –

+0

Vous avez raison! J'ai manqué cela ainsi que sous-ensemble le data.frame incorrectement ... J'ai mis à jour ma réponse, qui n'est pas différente de la réponse de joran ci-dessous. – sinclairjesse

1

solution améliorée basée sur ce Josh O'Briens.

df[rowSums(is.nan(as.matrix(df[2:3])))>1,] 
# 
# as.matrix because is.nan requires matrix (but is.na doesn't) 
# rowSums for speed gain 
# 
Questions connexes