2012-09-21 5 views
0

J'essaie d'isoler les colonnes d'une base de données pour lesquelles toutes les observations ont la même valeur (en ignorant les NA). Voir ci-dessous pour un exemple hypothétique:Isoler des colonnes avec des valeurs identiques

ForestName <- rep("Planige", 4) 
TreeNumber <- c(1:4) 
Height <- c(2.3, 2, 2.1, 2.9) 
Type <- c("AA", "AA", NA, "AA") 
df <- data.frame(ForestName, TreeNumber, Height, Type) 
df 

La nouvelle structure de données doit contenir ForestName et Type. Les colonnes avec des valeurs inégales (TreeNumber et Height) doivent être contenues dans une autre image.

Répondre

1

Parmi bien d'autres façons, je suis sûr que:

df[,sapply(df,function(x) {length(unique(x[!is.na(x)])) > 1})] 

    TreeNumber Height 
1   1 2.3 
2   2 2.0 
3   3 2.1 
4   4 2.9 

Et vous pouvez nier l'expression sapply pour obtenir les autres colonnes.

+0

Ce travaux! Merci! –

+0

@RobertWest veuillez marquer les bonnes solutions comme réponse acceptée. – Superbest

2

Vous pouvez utiliser unique et vérifier si cela se réduit à un seul élément:

df[sapply(df,function(x) length(unique(x[!is.na(x)])))==1] 
    ForestName Type 
1 Planige AA 
2 Planige AA 
3 Planige <NA> 
4 Planige AA 

Ou test all éléments sont égaux à la première non NA:

df[sapply(df, function(x) all(x==na.omit(x)[1],na.rm=T))] 
    ForestName Type 
1 Planige AA 
2 Planige AA 
3 Planige <NA> 
4 Planige AA 
+0

Cela fonctionne très bien aussi. Merci! –

0

Un peu plus compact approche en utilisant le même principe de base

Filter(function(x){length(unique(x[!is.na(x)])) <=1}, df) 
Questions connexes