2012-03-22 17 views
7

Vorrei identificare le colonne binarie in un data.frame.Identifica colonne binarie

Ad esempio, questa tabella

my.table <-read.table(text="a,b,c 
0,2,0 
0.25,1,1 
1,0,0", header=TRUE, as.is=TRUE,sep = ",") 

darebbe FALSE, FALSE, TRUE

risposta

8
apply(my.table,2,function(x) { all(x %in% 0:1) }) 

(o

apply(my.table,2,function(x) { all(na.omit(x) %in% 0:1) }) 

se si desidera consentire per NA valori)

+0

potrei provare a cattura le variabili binarie con livelli diversi da 0,1 con la funzione (x) length (unique (x))> 2. può essere? – Seth

+1

E se non sono tutti codificati con 0,1 puoi controllare 'length (unique (x)' solo per due valori – joran

+0

@Seth, @Joran, quelli sono idee carine, ma se la tua tabella fosse 'matrix (c (0,1,0,1,1,2), nrow = 3) "vorresti che la seconda colonna venisse rilevata come binaria? Dovresti essere un po 'più cauta. Cioè, immagino dipenda da come .. si definisce "binario" –

3

Se si desidera accettare colonne binari con NA in loro, il seguente dovrebbe fare il trucco:

is.binary <- function(v) { 
    x <- unique(v) 
    length(x) - sum(is.na(x)) == 2L 
} 

my.table <- data.frame(a=11:15, b=c(T,F,T,NA,T), c=c('foo',NA,'bar','bar','foo')) 
vapply(my.table, is.binary, logical(1)) 
# a  b  c 
#FALSE TRUE TRUE 

... o se si accettano solo 0,1, NA:

is.binary <- function(v) { 
    x <- unique(v) 
    length(x) - sum(is.na(x)) == 2L && all(x[1:2] == 0:1) 
} 
+0

vedere il mio commento di cui sopra - penso basando 'binario' su 'lunghezza (unica (x)) == 2' potrebbe essere pericoloso. .. –

+0

... così ho aggiunto un'altra versione che accetta solo 0/1/NA. – Tommy

+0

OK, scusa, mi sono perso. –

Problemi correlati